Mindest- und Höchstdatum

128

Ich habe mich gefragt, welches das minimale und das maximale Datum für ein Javascript- DateObjekt ist. Ich fand heraus, dass das Mindestdatum ungefähr 200000 v. Chr. Ist, aber ich konnte keinen Hinweis darauf bekommen.

Kennt jemand die Antwort? Ich hoffe nur, dass es nicht vom Browser abhängt.

Eine Antwort in "Epochenzeit" (= Millisekunden von 1970-01-01 00:00:00 UTC + 00) wäre die beste.

MaxArt
quelle
Für eine Antwort zum Kopieren / Einfügen: stackoverflow.com/questions/27093130/…
Kieveli

Antworten:

177

Aus der Spezifikation, §15.9.1.1 :

Ein Datumsobjekt enthält eine Zahl, die einen bestimmten Zeitpunkt innerhalb einer Millisekunde angibt. Eine solche Zahl wird als Zeitwert bezeichnet. Ein Zeitwert kann auch NaN sein, was anzeigt, dass das Datumsobjekt keinen bestimmten Zeitpunkt darstellt.

Die Zeit wird in ECMAScript in Millisekunden seit dem 1. Januar 1970 UTC gemessen. In Zeitwerten werden Schaltsekunden ignoriert. Es wird angenommen, dass es genau 86.400.000 Millisekunden pro Tag gibt. ECMAScript-Zahlenwerte können alle Ganzzahlen von –9.007.199.254.740.992 bis 9.007.199.254.740.992 darstellen. Dieser Bereich reicht aus, um Zeiten bis zur Millisekundengenauigkeit für jeden Moment zu messen, der innerhalb von ungefähr 285.616 Jahren liegt, entweder vorwärts oder rückwärts, ab dem 1. Januar 1970 UTC.

Der tatsächliche Zeitbereich, der von ECMAScript Date-Objekten unterstützt wird, ist geringfügig kleiner: genau –100.000.000 Tage bis 100.000.000 Tage, gemessen relativ zu Mitternacht zu Beginn des 1. Januar 1970 UTC. Dies ergibt einen Bereich von 8.640.000.000.000.000 Millisekunden zu beiden Seiten des 1. Januar 1970 UTC.

Der genaue Zeitpunkt der Mitternacht zu Beginn des 1. Januar 1970 UTC wird durch den Wert +0 dargestellt.

Der dritte Absatz ist der relevanteste. Basierend auf diesem Absatz können wir das genaue früheste Datum pro Spezifikation ab new Date(-8640000000000000)Dienstag, dem 20. April, 271.821 v. Chr. (BCE = Before Common Era , z. B. das Jahr -271.821) ermitteln.

TJ Crowder
quelle
1
Dies inspirierte ein isMin isMax-Feld wie in .net ... gist.github.com/QueueHammer/cb9bf736b81029d65485fb30ad01918d
QueueHammer
1
Deshalb funktioniert es nicht mit -9223372036854775808L ... Selbst nachdem ich es auf den neuesten Stand gebracht habe, gibt der Resever einen positiven Wert außerhalb des Bereichs zurück.
DeadManN
1
Ich weiß nicht, worüber sich die Leute beschweren, das funktioniert gut für mich. Übrigens frage ich mich, ob es eine Möglichkeit gibt, wie dies umgekehrt funktioniert (dh das BCE-Datum eingeben und die Epochensekunden als negatives int herausspringen lassen)?
Mark Seagoe
1
@ MarkSeagoe - Date.UTC(-271821, 3, 20)kehrt zurück -8640000000000000. :-)
TJ Crowder
neues Datum ('275760-9-13 05:30:00')
AshTyson
52

Um die Antwort von TJ zu erweitern, wird durch Überschreiten der Min / Max-Werte ein ungültiges Datum generiert.

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
quelle
-8

Wie Sie sehen können, gibt der 01.01.1970 0 zurück, was bedeutet, dass dies das niedrigstmögliche Datum ist.

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
quelle
9
Was ist der Sinn Ihrer Antwort? Wie reagiert es auf die ursprüngliche Frage?
MaxArt
Der 1.1.1970 ist nicht das niedrigstmögliche Datum. Sie können eine negative Zahl übergeben, um ein Datum vor dem 1.1.1970 zu erhalten.
inejwstine