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

Мне было интересно, что является минимальной и максимальной датой, допустимой для объекта Javascript Date. Я обнаружил, что минимальная дата - что-то вроде 200000 до н.э., но я не мог получить какую-либо ссылку об этом.

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

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

Ответ 1

Из spec, & sect; 15.9.1.1:

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

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

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

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

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

Ответ 2

Чтобы увеличить T.J. ответ, превышающий значения min/max, генерирует недопустимую дату.

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

Ответ 3

Чуть более понятный, но менее эффективный код

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