Минимальная и максимальная дата

129

Мне было интересно, какая минимальная и максимальная дата разрешена для Dateобъекта Javascript . Я обнаружил, что минимальная дата составляет примерно 200 000 лет до нашей эры, но я не мог получить никаких сведений об этом.

Кто-нибудь знает ответ? Я просто надеюсь, что это не зависит от браузера.

Лучше всего будет ответ в "эпоху" (= миллисекунды с 1970-01-01 00:00:00 UTC + 00).

MaxArt
источник
Ответ для копирования / вставки: stackoverflow.com/questions/27093130/…
Киевели

Ответы:

178

Из спецификации, §15.9.1.1 :

Объект Date содержит число, указывающее конкретный момент времени с точностью до миллисекунды. Такое число называется временной ценностью. Значение времени также может быть NaN, что указывает на то, что объект Date не представляет конкретный момент времени.

В ECMAScript время измеряется в миллисекундах с 1 января 1970 года по всемирному координированному времени. Во времени значения дополнительных секунд игнорируются. Предполагается, что в день ровно 86 400 000 миллисекунд. Значения ECMAScript Number могут представлять все целые числа от –9,007,199,254,740,992 до 9,007,199,254,740,992; этого диапазона достаточно для измерения времени с точностью до миллисекунды для любого момента, который находится в пределах примерно 285 616 лет, вперед или назад, с 1 января 1970 года по всемирному координированному времени.

Фактический диапазон времени, поддерживаемый объектами ECMAScript Date, немного меньше: точно от –100000000 дней до 100000000 дней, измеренных относительно полуночи в начале 1 января 1970 года по всемирному координированному времени. Это дает диапазон 8 640 000 000 000 000 миллисекунд в любую сторону от 1 января 1970 года по всемирному координированному времени.

Точный момент полуночи в начале 1 января 1970 года по всемирному координированному времени представлен значением +0.

Третий абзац является наиболее актуальным. Основываясь на этом абзаце, мы можем получить точную самую раннюю дату согласно спецификации new Date(-8640000000000000), а именно вторник, 20 апреля 271 821 г. до н.э. (до н.э. = до нашей эры , например, -271 821 год).

TJ Crowder
источник
1
Это вдохновило на создание поля isMin isMax, например, в .net ... gist.github.com/QueueHammer/cb9bf736b81029d65485fb30ad01918d
QueueHammer
1
Вот почему он не работает с -9223372036854775808L ... Даже после того, как я изменил его на дату, ресивер возвращает положительное значение вне диапазона.
deadManN
1
Я не знаю, на что люди жалуются, мне это подходит. Кстати, мне интересно, есть ли способ, которым это работает в обратном порядке (например, ввод даты BCE и получение секунд эпохи, отображаемых как отрицательное int)?
Марк Сигоу
1
@MarkSeagoe - Date.UTC(-271821, 3, 20)возвращается -8640000000000000. :-)
TJ Crowder
новая дата ('275760-9-13 05:30:00')
ЭшТайсон,
52

Чтобы увеличить ответ TJ, превышение минимального / максимального значений создает недопустимую дату.

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

Как видите, 01.01.1970 возвращает 0, что означает наименьшую возможную дату.

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
источник
9
В чем смысл вашего ответа? Как он отвечает на исходный вопрос?
MaxArt
01.01.1970 - не самая низкая дата. Вы можете передать отрицательное число, чтобы получить дату до 01.01.1970.
inejwstine,