Unix-время в одном абзаце
Unix-время — это число секунд, прошедших с 00:00:00 UTC 1 января 1970 года; этот момент называют эпохой (epoch). Оно полностью игнорирует часовые пояса и переход на летнее время: в любой момент Unix-время — одно и то же число в любой точке Земли. Поэтому это естественный формат для хранения и сравнения моментов в базах данных, логах, полях JWT exp и iat, времени изменения файлов, ответах API и планировщиках в духе cron. Проблема в том, что 1700000000 человеку ничего не говорит — для этого и нужен конвертер. Для справки: это 14 ноября 2023 года, 22:13:20 UTC.
Секунды, миллисекунды и числа подлиннее
Разные системы считают в разных единицах:
- Секунды, 10 цифр для текущих дат: утилиты Unix и Linux, PHP
time(), Pythontime.time()(с дробной частью), большинство SQL-баз, JWT. - Миллисекунды, 13 цифр: JavaScript
Date.now(), JavaSystem.currentTimeMillis(), многие JSON API и события аналитики. - Микросекунды, 16 цифр, и наносекунды, 19 цифр: некоторые базы данных, Go, инструменты высокоточной трассировки.
Инструмент определяет единицу по величине. Любое целое число с абсолютным значением меньше 100 000 000 000 читается как секунды, до 100 000 000 000 000 (14 цифр) — как миллисекунды, меньше 10^17 — как микросекунды, а всё, что больше, — как наносекунды. Эти пороги работают для любого реалистичного случая: в секундах первый из них был бы 5138 годом, в миллисекундах — началом марта 1973 года.
Значения в микро- и наносекундах обрезаются до миллисекунд, потому что точнее результаты не показывают. Дробные значения вроде 1700000000.5 не принимаются, так что сначала отбросьте дробную часть.
Отрицательные числа работают и дают даты до 1970 года: -86400 — это 31 декабря 1969 года.
Как читать шесть результатов
- Unix, секунды и Unix, миллисекунды: один и тот же момент в обеих единицах. Миллисекунды сохраняются, если вы вставили дату со временем вроде
.250; значение в секундах округляется вниз. - ISO 8601: например,
2023-11-14T22:13:20.000Z. Всегда в UTC, что обозначаетZ, с точностью до миллисекунд. Это самый безопасный формат для API и JSON: он правильно сортируется как текст, и его разбирает любой язык. - UTC: дата в стиле HTTP,
Tue, 14 Nov 2023 22:13:20 GMT, которая используется в заголовкахExpires,Last-Modifiedи cookie. - Ваш часовой пояс: день/месяц/год с 24-часовым временем, за которыми идёт сокращение часового пояса (или смещение от GMT, если сокращения нет) и название пояса, которое сообщает браузер, например
Europe/Berlin. Летнее время учитывается для этой даты, а не по сегодняшнему смещению. - Относительно: формулировки вроде «вчера», «через 3 дня» или «2 года назад». Они намеренно приблизительные: месяц считается в среднем как 30,4 дня, а значение обновляется, пока страница открыта.
Как перевести дату в timestamp
Вместо числа можно вставить дату. Самый надёжный ввод — строки ISO 8601, а правила часовых поясов стоит знать, потому что именно из-за них чаще всего ошибаются на несколько часов:
2024-05-01T12:00:00Zи2024-05-01T12:00:00+02:00несут собственное смещение и однозначны.2024-05-01без времени считается полуночью по UTC.2024-05-01T12:00и2024-05-01 12:00— дата со временем, но без смещения — считаются вашим местным временем.
Поэтому если вы летом в Берлине, 2024-05-01 и 2024-05-01 00:00 различаются на два часа. Когда конвертируете для сервера или API, добавляйте Z или явное смещение, чтобы не было догадок.
Другие форматы, например May 1, 2024 12:00, зависят от парсера дат браузера и могут вести себя по-разному в Chrome, Firefox и Safari. Форматы, где первым идёт день, вроде 01/05/2024, читаются в американском стиле с месяцем впереди или отклоняются, так что их лучше избегать.
Подводные камни
- Високосные секунды. Unix-время делает вид, что в каждых сутках ровно 86 400 секунд. 27 високосных секунд, добавленных с 1972 года, не учитываются, что важно только для точных научных измерений времени.
- Проблема 2038 года. Системы, которые хранят Unix-время как знаковое 32-битное целое, переполняются на
2147483647— это 19 января 2038 года, 03:14:07 UTC. Вставьте это число, чтобы убедиться. Современные 64-битные системы не затронуты, а вот старые встраиваемые устройства и форматы файлов — могут быть. - Расхождение часов. Если JWT отклоняется как «ещё не действителен» или «истёк», сравните его
iatиexpс живым значением Текущее Unix-время вверху страницы. Разница в несколько минут указывает на неправильные часы, а не на плохой токен.
Чтобы прочитать поля токена, декодируйте его среднюю часть инструментом «Base64 кодировщик и декодировщик» и приведите JSON в порядок в «JSON форматирование и валидация». Конвертация выполняется в браузере по его собственным часам и настройкам часового пояса.