Avatar billede heyn Nybegynder
16. februar 2006 - 10:38 Der er 24 kommentarer og
1 løsning

PHP's strtotime() oversat til JavaScript.

Jeg har en formular der indlæser 2 datoer 'start' og 'slut' på formen 'YYYY-mm-dd HH:ii:ss'.
Jeg ønsker at lave et script der sammenligner de 2 og bestemmer hvilken der er ældst.
I PHP ville jeg skrive

if (strtotime($start) < strtotime($slut)) ....
else ....

Findes der i JavaScript en funktion der fungerer på samme vis som strtotime() i PHP?
Mvh Christian
Avatar billede ldanielsen Nybegynder
16. februar 2006 - 11:55 #1
var dtmDato = new Date(2006, 2, 16)

Dette er den sikre måde at lave det på. Jeg går ud fra at du har en strent i stil med "16-2-2006" så du kan gøre sådan:

var strDato = "16-2-2006"
var dtmDato = new Date(strDato.split("-")[2], strDato.split("-")[1], strDato.split("-")[0])
Avatar billede heyn Nybegynder
16. februar 2006 - 12:51 #2
Nej - min streng er på formen start = '2006-02-16 12:45:15'.
Timer og minutter har også betydning.
Det er derfor jeg i PHP anvender strtotime($start), da det jo giver antal sekunder siden '1970-01-01 00:00:00'.
Man kan så bare sammenligne størrelsen af de 2 tal.
Avatar billede ldanielsen Nybegynder
16. februar 2006 - 12:59 #3
OK.

Date.UTC(year, month, day, hrs, min, sec)

- returnerer antal ms siden 1/1/1970
Avatar billede heyn Nybegynder
16. februar 2006 - 13:25 #4
Vil det sige at følgende script vil fortælle mig om alt er ok? (sec og ms er uden betydning hos mig):

start = "2006-02-16 13:30:00"; slut = "2006-02-17 13:30:00";
start = Date.UTC(substr(start,0,4),(parseint(substr(start,5,2))-1),substr(start,8,2),substr(start,14,2));
slut = Date.UTC(substr(slut,0,4),(parseint(substr(slut,5,2))-1),substr(slut,8,2),substr(slut,14,2));
if (slut >= start) window.alert("OK - slutdato kommer efter startdato");
else window.alert("FEJL - slutdato kommer før startdato");

Opfatter Date.UTC f.eks. kl. 08 som et 8-tal el. skal man først fjerne foranstående 0?
Mvh Christian
Avatar billede ldanielsen Nybegynder
16. februar 2006 - 14:02 #5
Det er ikke helt rigtigt. Du behøver ikke at fjerne 0'erne, men du bruger substring forkert:

substr(start,5,2)

skal være:

start.substring(5, 7)

Så:

start = "2006-02-16 13:30:00"; slut = "2006-02-17 13:30:00";
start = Date.UTC(start.substring(0,4), start.substring(5,7), start.substring(8,10), start.substring(14,16));
slut = Date.UTC(slut.substring(0,4), slut.substring(5,7), slut.substring(8,10), slut.substring(14,16));
if (slut >= start) window.alert("OK - slutdato kommer efter startdato");
else window.alert("FEJL - slutdato kommer før startdato");


Men da du har datoerne i velformede strenge, er det nok at se hvilken der kommer først alfabetisk:

start = "2006-02-16 13:30:00"; slut = "2006-02-17 13:30:00";
if (slut >= start) window.alert("OK - slutdato kommer efter startdato");
else window.alert("FEJL - slutdato kommer før startdato");

Ja, "abc" > "abd", sådan kan man også bruge større/mindre end.


Faktisk kan man også sammenligne datoer direkte. Jeg laver nu de to strenge om til datoer, og sammenligner datoobjekterne direkte:

start = Date("2006-02-16 13:30:00"); slut = Date("2006-02-17 13:30:00");
if (slut >= start) window.alert("OK - slutdato kommer efter startdato");
else window.alert("FEJL - slutdato kommer før startdato");
Avatar billede heyn Nybegynder
16. februar 2006 - 14:38 #6
Ok - tak for hjælpen. Læg et svar.

Men er du sikker på det med substr().
Jeg kikkede nemlig i http://www.w3schools.com/jsref/jsref_substr.asp og den siger substr(start,length). (ligesom ved PHP).

Mvh Christian
Avatar billede heyn Nybegynder
16. februar 2006 - 14:43 #7
Og da måneder i JS går fra 0 - 11 må man vel anvende parseint() således at 01 bliver til 0 osv.
Mvh Christian
Avatar billede ldanielsen Nybegynder
16. februar 2006 - 14:50 #8
i date constructor'en skal man bruge 1 - 12 for måndeder

substr(..), nej, og det virker ikke når jeg tester det.

Tak for p
Avatar billede ldanielsen Nybegynder
16. februar 2006 - 14:52 #9
Jo, man kan skrive substr i stedet for substring, man du skal stadig bruge tekstVar.substr(intStart, intEnd)
Avatar billede roenving Novice
16. februar 2006 - 14:58 #10
Tjah, jeg ville splitte strengene:

start = "2006-02-16 13:30:00".split(/[- :]/); slut = "2006-02-17 13:30:00".split(/[- :]/);
start = Date.UTC(start[0],parseInt(start[1],10)-1,start[2],start[3],start[4],start[5]);

-- jeg har ikke kigget på Date.UTC før, så der skulle et opslag til at finde ud af, at den også bruger måneder som indeks !-)
Avatar billede roenving Novice
16. februar 2006 - 15:00 #11
Hrm, de to metoder kan simpelthen noget forskelligt !-)

String.substr(start [,length])
String.sbstring(indexA [,indexB])
Avatar billede heyn Nybegynder
16. februar 2006 - 16:24 #12
Jeg tænkte jo egentlig på noget der replikerer strtotime() i PHP, som jo returnerer i sekunder - ikke millisekunder.
Jeg har derfor lavet følgende lille (testede) funktion.

// Returnerer antal sekunder siden '1970-01-01 00:00:00'
//str = 'YYYY-mm-dd HH:ii:ss'
function PHP_strtotime(str){
    test = str.split(/[- :]/);
    return Date.UTC(test[0],parseInt(test[1],10)-1,test[2],test[3],test[4],test[5])/1000;
}

Den er jo altid rar at have i baghånden.
Mvh Christian.
Avatar billede ldanielsen Nybegynder
17. februar 2006 - 00:25 #13
Jeg forstår ikke at du trækker 1 fra måneden. Er du sikker på at det er korrekt?

I tilfældet hvor du bare skal se hvilken dato bliver først vil det ikke betyde noget for udfaldet, for du gør det samme med begge datoer.
Avatar billede olebole Juniormester
17. februar 2006 - 00:33 #14
<ole>

Januar er jo måned nummer 0, så det er vel ikke helt galt  :)

/mvh
</bole>
Avatar billede olebole Juniormester
17. februar 2006 - 00:37 #15
- og:

var str = "1970-01-01 00:00:20";
alert( PHP_strtotime(str) );

- returnerer 20, så en simpel test peger også i den retning
Avatar billede ldanielsen Nybegynder
17. februar 2006 - 09:23 #16
Undskyld, du har ret. :o)
Avatar billede roenving Novice
17. februar 2006 - 13:28 #17
-- og det kom forøvrigt en sød smiley ud af den regExp [- :]
Avatar billede ldanielsen Nybegynder
17. februar 2006 - 13:43 #18
Hov, jeg har næsten ret alligevel, jeg skulle lige teste det:

document.write(Date(2006, 2, 17))

giver
Fri Feb 17 13:37:03 2006

MEN

var d = new Date(2006, 2, 17)
document.write(d)

giver
Fri Mar 17 00:00:00 UTC+0100 2006

(i min engelske browser)


Min (ældgamle) JavaScript dokumentation siger at man skal bruge 0 - 11 som måned:

new Date(yr_num, mo_num, day_num)
new Date(yr_num, mo_num, day_num, hr_num, min_num, sec_num)

yr_num, mo_num,day_num, hr_num,min_num, sec_num

Integer values representing part of a date. As an integer value, the month is represented by 0 to 11 with 0=January and 11=December.

Men det komme åbenbart an på om man bruger new eller ikke. Jeg er lidt forvirret nu, er syntaksen uden new egentlig korrekt? Den virker i MSIE, men det er jo ikke nogen garanti.
Avatar billede ldanielsen Nybegynder
17. februar 2006 - 13:44 #19
har fundet svaret: Hvis jeg kalder Date() uden new, så ignorerer den argumenterne.
Avatar billede olebole Juniormester
17. februar 2006 - 14:59 #20
- nej, det virker kun øjensynligt i IE. 'Date()' returnerer en streng, mens 'new Date()' returnerer et objekt. Når du i JS kalder en constructor-funktion med operatoren 'new' returneres altid et objekt ... pokkers til forskel fra en streng  ;o)
Avatar billede olebole Juniormester
17. februar 2006 - 15:00 #21
Prøv evt:
    alert(typeof Date());
    alert(typeof new Date());
Avatar billede ldanielsen Nybegynder
20. februar 2006 - 09:03 #22
OK, det tror jeg aldrig jeg havde opdaget ellers.
Avatar billede heyn Nybegynder
20. februar 2006 - 10:20 #23
Date() beskæftier sig udelukkende med dags dato.
Objektet Date() beregner, men tester ikke, indholdet. Det gælder både IE6 og FireFox. Prøv følgende.
function test_date(){
    var d = new Date()
    dm = new Date(2006,1,31);
    if (dm) document.write(dm);
    if (Date(2006,2,31)) document.write(Date(2006,2,31));
}
test_date();
Mvh Christian
Avatar billede heyn Nybegynder
20. februar 2006 - 10:56 #24
Men på den anden side godkendes
Date.UTC(1970,0,1,0,0,1);
øjensynligt som et objekt.
Mvh Christian
Avatar billede heyn Nybegynder
20. februar 2006 - 11:09 #25
Iøvrigt giver følgende samme resultat:
Date.UTC(1970,12,0,0,0,1);
Date.UTC(1971,0,0,0,0,1);
Hvis man vil tælle antallet af millisekunder mellem 2 måned uden i forvejen at kende antallet af måneder imellem dem kan man altså bare skrive f.eks.
Date.UTC(1977,(9+antal_m),4,0,0,0) - Date.UTC(1977,9,4,0,0,0);
Mvh Christian
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester