16. februar 2006 - 10:38Der 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
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.
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
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");
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.
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.
- 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)
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
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
Synes godt om
Ny brugerNybegynder
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.