Data mínima e máxima


128

Eu queria saber qual é a data mínima e máxima permitida para um Dateobjeto Javascript . Eu descobri que a data mínima é algo como 200000 aC, mas não consegui nenhuma referência sobre isso.

Alguém sabe a resposta? Só espero que não dependa do navegador.

Uma resposta em "época da época" (= milissegundos de 01-01-2009 00:00:00 UTC + 00) seria a melhor.


Para uma resposta de copiar / colar: stackoverflow.com/questions/27093130/…
Kieveli

Respostas:


177

Das especificações, §15.9.1.1 :

Um objeto Date contém um número que indica um instante em particular dentro de um milissegundo. Esse número é chamado de valor temporal. Um valor de tempo também pode ser NaN, indicando que o objeto Date não representa um instante específico de tempo.

O tempo é medido no ECMAScript em milissegundos desde 01 de janeiro de 1970 UTC. Os valores no tempo pulam segundos são ignorados. Supõe-se que haja exatamente 86.400.000 milissegundos por dia. Os valores do número ECMAScript podem representar todos os números inteiros de –9.007.199.254.740.992 a 9.007.199.254.740.992; esse intervalo é suficiente para medir tempos com precisão de milissegundos por qualquer instante em aproximadamente 285.616 anos, para frente ou para trás, a partir de 01 de janeiro de 1970, UTC.

O intervalo real de horas suportado pelos objetos ECMAScript Date é um pouco menor: exatamente –100.000.000 dias a 100.000.000 dias medidos em relação à meia-noite no início de 01 de janeiro de 1970 UTC. Isso fornece um intervalo de 8.640.000.000.000.000.000 milissegundos para os dois lados de 01 de janeiro de 1970, UTC.

O momento exato da meia-noite no início de 01 de janeiro de 1970 UTC é representado pelo valor +0.

O terceiro parágrafo é o mais relevante. Com base nesse parágrafo, podemos obter a data mais new Date(-8640000000000000)precoce precisa por especificação , que é terça-feira, 20 de abril de 271.821 AEC (AEC = Antes da Era Comum , por exemplo, o ano -271.821).


1
Isto inspirou um campo isMin isMax como em .net ... gist.github.com/QueueHammer/cb9bf736b81029d65485fb30ad01918d
QueueHammer

1
É por isso que ele não funciona com -9223372036854775808L ... Mesmo depois de alterá-lo para a data, o resever retorna um valor positivo fora do intervalo.
deadManN

1
Não sei do que as pessoas estão reclamando, isso funciona bem para mim. BTW Gostaria de saber se existe alguma maneira de isso funcionar ao contrário (ou seja, digitando a data do BCE e obtendo os segundos da época como um int negativo)?
Marque # Seagoe

1
@MarkSeagoe - Date.UTC(-271821, 3, 20)retorna -8640000000000000. :-)
TJ Crowder

new Date ('275760-9-13 05:30:00')
AshTyson

52

Para aumentar a resposta de TJ, exceder os valores mínimo / máximo gera uma Data 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


-8

Como você pode ver, 01/01/1970 retorna 0, o que significa que é a data mais baixa possível.

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

9
Qual é o sentido da sua resposta? Como ele responde à pergunta original?
MaxArt 31/07

1/1/1970 não é a data mais baixa possível. Você pode passar um número negativo para obter uma data anterior a 1/1/1970.
inejwstine 13/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.