2010-03-05 11 views
8

Modifica: Non è un bug come ha sottolineato Martin. Sto solo attraversando l'ora legale, quindi la differenza di 1 ora.Javascript Differenza di data bug?

voglio calcolare la differenza in giorni tra "29 Mar 2010" e "9 marzo 2010" così ho il seguente codice:

((new Date(2010, 2, 29)).getTime() - (new Date(2010, 2, 8)).getTime())/86400000 

86400000 è il numero di millisecondi in un giorno e la differenza tra le date viene restituito in millisecondi, quindi dovrebbe funzionare. Solo che non è abbastanza. Ottengo

20.958333333333332 

È la differenza tra quelle 2 date che è sbagliato. Si suppone che sia 1814400000 (21 giorni tempi di 86,4 milioni), ma in realtà è 1810800000.

Inoltre se cambio la differenza:

((new Date(2010, 2, 28)).getTime() - (new Date(2010, 2, 7)).getTime())/86400000 

la stessa differenza, spostato solo un giorno indietro, ottengo normale risultati.

Ciò avviene solo se cerchiamo di ottenere (xy) dove x è dopo il 29 marzo 2010 e y è prima del 29 marzo 2010.

ottengo questo su Safari 4 e Firefox 3.6 su Mac, così come IE 8 su windows 7. Non ho provato altri browser.

Sto facendo qualcosa di sbagliato o si tratta di un bug noto?

+1

La seconda data è 8 Marzo 2010. – SLaks

risposta

11

Stai attraversando un limite di ora legale, quindi la differenza di 1 ora.

+0

Sì, hai ragione :) Ho aggiunto 3.600.000 alla differenza di data e la divisione è risultata corretta. Sciocco da parte mia lasciare che questo scivolone. – disc0dancer

+0

DST è il 14 marzo di quest'anno negli Stati Uniti. È incluso in entrambe le gamme, non è vero? –

+0

Sono in Macedonia, quindi è diverso sulla mia macchina credo. – disc0dancer

2

L'ora legale fa diventare aritmetica la data una cosa complicata. Significa che mentre 363 giorni all'anno sono 24 ore, un giorno è 25 ore e un giorno è solo 23 ore. Personalmente voto per abolire l'ora legale.

In Java, c'è una classe GregorianCalendar che esegue l'aritmetica data correttamente nonostante l'ora legale. Immagino che non sia di grande aiuto in Javascript.

2

(vedo hai preso il cambio ora legale)

Qualsiasi divisione javascript è tale da avere in virgola mobile problemi-impostare la 'precisione' è necessario.

Non è necessario ottenere il tempo da soli- javascript farà la conversione per te.

+((new Date(2010, 2, 29) - new Date(2010, 2, 8))/ 86400000).toFixed(2) 

/* valore restituito: (numero) 20.96 (., Ora locale, che può essere quello che desidera-altrimenti, impostare le parti della data UTC) */

+1

Potrei anche usare Math.round() sul risultato dato che la differenza di 1 ora non sarà mai sufficiente per darti errori nell'arrotondamento. Mi chiedo quale sia più veloce? – disc0dancer