Fecha mínima y máxima

128

Me preguntaba cuál es la fecha mínima y máxima permitida para un Dateobjeto Javascript . Descubrí que la fecha mínima es algo así como 200000 AC, pero no pude obtener ninguna referencia al respecto.

Alguien sabe la respuesta? Solo espero que no dependa del navegador.

Una respuesta en "tiempo de época" (= milisegundos desde 1970-01-01 00:00:00 UTC + 00) sería la mejor.

MaxArt
fuente
Para obtener una respuesta de copiar / pegar: stackoverflow.com/questions/27093130/…
Kieveli

Respuestas:

177

De la especificación, §15.9.1.1 :

Un objeto Date contiene un Número que indica un instante particular en el tiempo dentro de un milisegundo. Tal número se llama valor de tiempo. Un valor de tiempo también puede ser NaN, lo que indica que el objeto Fecha no representa un instante de tiempo específico.

El tiempo se mide en ECMAScript en milisegundos desde el 1 de enero de 1970 UTC. En el tiempo, los segundos bisiestos se ignoran. Se supone que hay exactamente 86,400,000 milisegundos por día. Los valores del número ECMAScript pueden representar todos los enteros desde –9,007,199,254,740,992 hasta 9,007,199,254,740,992; este rango es suficiente para medir tiempos de precisión de milisegundos para cualquier instante que esté dentro de aproximadamente 285,616 años, ya sea hacia adelante o hacia atrás, desde el 1 de enero de 1970 UTC.

El rango real de tiempos admitidos por los objetos de fecha ECMAScript es ligeramente menor: exactamente –100,000,000 días a 100,000,000 días medidos en relación con la medianoche al comienzo del 01 de enero de 1970 UTC. Esto da un rango de 8,640,000,000,000,000 milisegundos a cada lado del 1 de enero de 1970 UTC.

El momento exacto de la medianoche a principios del 01 de enero de 1970 UTC está representado por el valor +0.

El tercer párrafo es el más relevante. Con base en ese párrafo, podemos obtener la fecha más temprana precisa por especificación new Date(-8640000000000000), que es el martes 20 de abril de 271,821 aC (BCE = Antes de la era común , por ejemplo, el año -271,821).

TJ Crowder
fuente
1
Esto inspiró un campo isMin isMax como en .net ... gist.github.com/QueueHammer/cb9bf736b81029d65485fb30ad01918d
QueueHammer
1
Es por eso que no funciona con -9223372036854775808L ... Incluso después de cambiarlo a la fecha, el valor de retorno positivo devuelve positivo fuera del rango.
deadManN
1
No sé de qué se queja la gente, esto funciona bien para mí. Por cierto, me pregunto si hay alguna forma de que esto funcione a la inversa (es decir, ingresar la fecha BCE y obtener los segundos de la época como un int negativo).
Mark Seagoe
1
@ MarkSeagoe - Date.UTC(-271821, 3, 20)vuelve -8640000000000000. :-)
TJ Crowder
nueva Fecha ('275760-9-13 05:30:00')
AshTyson
52

Para aumentar la respuesta de TJ, exceder los valores min / max genera una fecha inválida.

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

Como puede ver, 01/01/1970 devuelve 0, lo que significa que es la fecha más baja posible.

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
fuente
9
¿Cuál es el punto de tu respuesta? ¿Cómo responde a la pregunta original?
MaxArt
1/1/1970 no es la fecha más baja posible. Puede pasar un número negativo para obtener una fecha anterior al 1/1/1970.
inejwstine