Data minimalna i maksymalna

134

Zastanawiałem się, jaka jest minimalna i maksymalna data dozwolona dla Dateobiektu JavaScript . Okazało się, że minimalna data to około 200000 lat pne, ale nie mogłem uzyskać na ten temat żadnej informacji.

Czy ktoś zna odpowiedź? Mam tylko nadzieję, że nie zależy to od przeglądarki.

Najlepsza byłaby odpowiedź w „czasie epoki” (= milisekundy od 1970-01-01 00:00:00 UTC + 00).

MaxArt
źródło
Aby uzyskać odpowiedź typu „kopiuj / wklej”: stackoverflow.com/questions/27093130/…
Kieveli

Odpowiedzi:

181

Ze specyfikacji, §15.9.1.1 :

Obiekt Date zawiera liczbę wskazującą konkretną chwilę w czasie z dokładnością do milisekundy. Taka liczba nazywana jest wartością czasu. Wartością czasu może być również NaN, co oznacza, że ​​obiekt Date nie reprezentuje określonej chwili.

Czas jest mierzony w ECMAScript w milisekundach od 1 stycznia 1970 UTC. W wartościach czasu sekundy przestępne są ignorowane. Przyjmuje się, że dziennie jest dokładnie 86 400 000 milisekund. Wartości ECMAScript Number mogą reprezentować wszystkie liczby całkowite od –9 007 199 254 740 992 do 9 007 199 254 740 992; zakres ten jest wystarczający do pomiaru czasów z dokładnością do milisekund dla dowolnej chwili mieszczącej się w zakresie około 285 616 lat, do przodu lub do tyłu, od 1 stycznia 1970 UTC.

Rzeczywisty zakres czasów obsługiwanych przez obiekty ECMAScript Date jest nieco mniejszy: dokładnie od –100 000 000 dni do 100 000 000 dni mierzonych względem północy na początku 1 stycznia 1970 UTC. Daje to zakres 8 640 000 000 000 000 milisekund po każdej stronie 1 stycznia 1970 UTC.

Dokładny moment północy na początku 1 stycznia 1970 UTC jest reprezentowany przez wartość +0.

Trzeci akapit jest najbardziej istotny. Na podstawie tego akapitu możemy uzyskać dokładną najwcześniejszą datę według specyfikacji new Date(-8640000000000000), czyli wtorek 20 kwietnia 271 821 pne (pne = Przed naszą erą , np. Rok -271 821).

TJ Crowder
źródło
1
To zainspirowało pole isMin isMax, takie jak w .net ... gist.github.com/QueueHammer/cb9bf736b81029d65485fb30ad01918d
QueueHammer
1
Dlatego to nie działa z -9223372036854775808L ... Nawet po zmianie daty, zasobnik zwraca dodatnią wartość poza zakresem.
deadManN
1
Nie wiem, na co narzekają ludzie, dla mnie to działa dobrze. Swoją drogą, zastanawiam się, czy jest jakikolwiek sposób, żeby to działało w odwrotnej kolejności (tj. Wpisanie daty pne i wyskoczenie sekund epoki jako ujemne int)?
Mark Seagoe
1
@MarkSeagoe - Date.UTC(-271821, 3, 20)zwraca -8640000000000000. :-)
TJ Crowder
nowa data ('275760-9-13 05:30:00')
AshTyson
54

Aby wzmocnić odpowiedź TJ, przekroczenie wartości min / max generuje nieprawidłową datę.

let maxDate = new Date(8640000000000000);
let minDate = new Date(-8640000000000000);

console.log(new Date(maxDate.getTime()).toString());
console.log(new Date(maxDate.getTime() - 1).toString());
console.log(new Date(maxDate.getTime() + 1).toString()); // Invalid Date

console.log(new Date(minDate.getTime()).toString());
console.log(new Date(minDate.getTime() + 1).toString());
console.log(new Date(minDate.getTime() - 1).toString()); // Invalid Date

Shaun Luttin
źródło
-9

Jak widać, 01/01/1970 zwraca 0, co oznacza, że ​​jest to najmniejsza możliwa data.

new Date('1970-01-01Z00:00:00:000') //returns Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)
new Date('1970-01-01Z00:00:00:000').getTime() //returns 0
new Date('1970-01-01Z00:00:00:001').getTime() //returns 1
ColacX
źródło
9
Jaki jest sens twojej odpowiedzi? Jak odpowiada na pierwotne pytanie?
MaxArt
1
01.01.1970 nie jest najniższą możliwą datą. Możesz podać liczbę ujemną, aby uzyskać datę przed 01.01.1970.
inejwstine