2012-09-30 24 views
5

Jaka jest maksymalna i minimalna data, którą mogę użyć z obiektem Date w JavaScript?Jaki zakres dat jest dozwolony w JavaScript?

Czy można reprezentować starożytne daty historyczne (np. January 1, 2,500 B.C.) lub daty dalekie w przyszłości (np. October 7, 10,000)?

Jeśli te odległe daty nie mogą być reprezentowane przez obiekt Date, w jaki sposób powinienem je reprezentować?

+0

Więc, o co pytamy * "Jeśli te odległe daty nie mogą być reprezentowane ..." * kiedy już wiesz, że mogą być reprezentowane? Po co zadawać pytanie, jeśli wiesz, że to kwestia? : P –

+0

@ user1689607 Nie wiem, bez niego pytanie wydawało się niekompletne. –

+0

Cóż, i tak było to interesujące pytanie. Dobrze widzieć, że JS nie cierpi z powodu problemu z 2038 roku. –

Odpowiedz

12

Według §15.9.1.1 of the ECMA-262 specification,

Czas jest mierzony w milisekundach w ECMAScript od 01 stycznia 1970 UTC.
...
Rzeczywisty zakres czasów obsługiwanych przez obiekty Data ECMAScript to ... dokładnie -100 000 000 dni do 100 000 000 dni, mierzone w stosunku do północy na początku 1 stycznia 1970 UTC. Daje to zakres 8,640 000 000 000 000 milisekund po obu stronach z dnia 1 stycznia 1970 roku UTC.

więc najwcześniej reprezentowalna z obiektem Date jest dość daleko poza znanym ludzkiej historii:

new Date(-8640000000000000).toUTCString() 
// Tue, 20 Apr 271,822 B.C. 00:00:00 UTC 

Ostateczny termin jest wystarczający, aby trwać poza Y10K a nawet poza Y100K, ale będą musiały być przerobione kilkaset lat przed Y276K.

new Date(8640000000000000).toUTCString() 
// Sat, 13 Sep 275,760 00:00:00 UTC 

Dowolna data poza tym zakresem zwróci Invalid Date.

new Date(8640000000000001) // Invalid Date 
new Date(-8640000000000001) // Invalid Date 

W skrócie, typ JavaScript Date będzie wystarczające do pomiaru czasu do millisecond dokładność w ciągu około 285616 lat przed 1 stycznia 1970 roku lub po. Daty podane w pytaniu są bardzo wygodne w tym zakresie.

+0

+1 dla bezpośredniego odniesienia-cytowania. –

+0

Uważam, że data przeszłości zawiera literówkę. Otrzymuję nową nową datę (-8640000000000000) .toUTCString() = 'wtorek, 20 kwietnia -271821 00:00:00 GMT' – Rohit

+0

@Rohit Zauważ "1" na końcu. 'Nowa data (-8640000000000001)' jest 'Nieprawidłowa data', podczas gdy' nowa data (-8640000000000000) 'jest datą, którą otrzymałeś, najwcześniejszą prawidłową datą. –