Время Unix считает секунды с 1970 года
Отметка времени Unix — это число секунд, прошедших с полуночи 1 января 1970 года по Гринвичу. Она не несёт ни часового пояса, ни летнего времени, и потому серверы и базы данных хранят моменты именно так. Читаемая человеком дата — это то же число, показанное в определённом поясе.
Число разрядов выдаёт единицу. Десять разрядов означают секунды, тринадцать — миллисекунды. JavaScript работает в миллисекундах, а инструменты Unix и многие базы данных — в секундах, поэтому умножать или делить на тысячу приходится постоянно.
Стандартная строковая запись — ISO 8601, вида 2026-09-16T00:00:00Z. Буква Z в конце означает всемирное время, а смещение вроде +09:00 появляется, когда указан пояс. Обмен датами в этом виде снимает двусмысленность, которую создаёт разный порядок дня, месяца и года в разных странах.
Ошибки, которые приходят из часовых поясов
У метки времени нет часового пояса, а у даты на экране есть. Москва на три часа впереди UTC, поэтому полночь UTC 16 сентября — это 3 часа ночи того же дня в Москве, а в Нью-Йорке ещё 20:00 15-го. Кажущийся сдвиг на сутки возникает, когда сравнивают только даты.
Смешав секунды с миллисекундами, вы забросите результат в 1970 год или на десятки тысяч лет вперёд. Преобразование, попавшее на 1 января 1970 года, означает, что миллисекунды прочитали как секунды; год в районе пятидесяти тысяч означает обратное.
Проблема 2038 года касается только систем, считающих секунды в знаковом тридцатидвухбитном целом. После 19 января 2038 года значение переполняется и становится отрицательным. Большинство нынешних сред работает с шестьюдесятью четырьмя битами, поэтому это всплывает в основном на старых встроенных устройствах и в унаследованных столбцах баз данных.