Date minimum et maximum

128

Je me demandais quelle est la date minimum et maximum autorisée pour un Dateobjet Javascript . J'ai trouvé que la date minimum est quelque chose comme 200000 BC, mais je n'ai pas pu obtenir de référence à ce sujet.

Quelqu'un connaît-il la réponse? J'espère juste que cela ne dépend pas du navigateur.

Une réponse en "temps de l'époque" (= millisecondes du 01/01/1970 à 00:00:00 UTC + 00) serait la meilleure.

MaxArt
la source
Pour une réponse copier / coller: stackoverflow.com/questions/27093130/…
Kieveli

Réponses:

177

D'après la spécification, §15.9.1.1 :

Un objet Date contient un nombre indiquant un instant particulier dans le temps à une milliseconde près. Un tel nombre est appelé une valeur de temps. Une valeur d'heure peut également être NaN, indiquant que l'objet Date ne représente pas un instant de temps spécifique.

Le temps est mesuré en ECMAScript en millisecondes depuis le 1er janvier 1970 UTC. Dans les valeurs de temps, les secondes intercalaires sont ignorées. On suppose qu'il y a exactement 86 400 000 millisecondes par jour. Les valeurs ECMAScript Number peuvent représenter tous les nombres entiers de –9 007 199 254 740 992 à 9 007 199 254 740 992; cette plage suffit pour mesurer les temps avec une précision à la milliseconde pour tout instant compris dans les 285 616 ans environ, en avant ou en arrière, à partir du 1er janvier 1970 UTC.

La plage de temps réelle prise en charge par les objets Date ECMAScript est légèrement plus petite: exactement –100 000 000 jours à 100 000 000 jours mesurés par rapport à minuit au début du 1er janvier 1970 UTC. Cela donne une plage de 8,640,000,000,000,000 millisecondes de chaque côté du 1er janvier 1970 UTC.

Le moment exact de minuit au début du 1er janvier 1970 UTC est représenté par la valeur +0.

Le troisième paragraphe est le plus pertinent. Sur la base de ce paragraphe, nous pouvons obtenir la date la plus ancienne par spécification new Date(-8640000000000000), qui est le mardi 20 avril 271 821 avant notre ère (BCE = Before Common Era , par exemple, l'année -271 821).

TJ Crowder
la source
1
Cela a inspiré un champ isMin isMax comme dans .net ... gist.github.com/QueueHammer/cb9bf736b81029d65485fb30ad01918d
QueueHammer
1
C'est pourquoi cela ne fonctionne pas avec -9223372036854775808L ... Même après l'avoir changé à ce jour, le resever retourne une valeur positive hors plage.
deadManN
1
Je ne sais pas de quoi les gens se plaignent, cela fonctionne bien pour moi. BTW je me demande s'il y a un moyen que cela fonctionne à l'envers (c'est-à-dire en entrant la date BCE et en faisant apparaître les secondes d'époque comme un int négatif)?
Mark Seagoe
1
@MarkSeagoe - Date.UTC(-271821, 3, 20)revient -8640000000000000. :-)
TJ Crowder
nouvelle date ('275760-9-13 05:30:00')
AshTyson
52

Pour augmenter la réponse de TJ, le dépassement des valeurs min / max génère une date invalide.

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
la source
-8

Comme vous pouvez le voir, 01/01/1970 renvoie 0, ce qui signifie que c'est la date la plus basse possible.

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
la source
9
Quel est le point de votre réponse? Comment répond-il à la question initiale?
MaxArt
1/1/1970 n'est pas la date la plus basse possible. Vous pouvez passer un nombre négatif pour obtenir une date antérieure au 1/1/1970.
inejwstine