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
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.