Объект JavaScript Date подвержен проблеме Y2038?

Предполагая 32-разрядную ОС/Браузер, может ли объект Date, созданный при опрокидывании JavaScript, до 1970 года, если я установил дату за пределами 2038?

Документация Mozilla говорит, что год может быть установлен в 9999, однако я не знаю, совместимо ли это во всех реализациях JavaScript, или если это точное описание того, что специфицирует спецификация.

Я бы подумал, что, учитывая формулировку в документации, похоже, что он либо использует 64-битное число для хранения времени, либо хранения фактических данных в формате даты ISO.

Кто-нибудь знает, как браузер реализует это?

Ответ 1

Не должно быть - согласно спецификации ECMAScript seciont 15.9.1.1:

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

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

Это дает диапазон 8 640 000 000 000 000 миллисекунд по обе стороны от 1 января, 1970 UTC. Точный момент полуночи в начале 01 января 1970 г. UTC представлен значением +0.

Ответ 2

Только побитовые операторы в JS являются 32-битными. Нет версии, которая это меняет, и нет разницы, если ваша ОС 64-битная. Так что, если кто-то использует побитовые метки времени, это может произойти. Например, здесь я использую побитовое или, потому что я хочу побочный эффект всех побитовых операторов, которые они преобразуют в int, просто я теряю миллисекунды даты.

new Date('2038-01-01T01:01:01.345') / 1000 | 0; // 2145913261.
new Date('2039-01-01T01:01:01.345') / 1000 | 0; // -2117518035. Wraps around...

Я мог бы использовать что-нибудь еще, например, Math.round или parseInt, и проблем не будет, но если я буду использовать побитовое, оно будет обтекать.