Идея в одном предложении
Unix-метка считает секунды (иногда миллисекунды) с согласованной эпохи: 1970-01-01T00:00:00Z—полночь UTC 1 января 1970 года—без високосных секунд в обычном определении POSIX. Это одно целое число однозначно хранит момент времени без метки часового пояса.
Преобразуйте числовую метку в читаемую дату с помощью инструмента Unix-метка → дата.
Почему инженерам нравятся секунды эпохи
Гражданские даты требуют календарей, поясов и летнего времени. Мгновенные события—«заказ оплачен», «сертификат истекает», «строка лога записана»—удобнее как монотонный счётчик от фиксированного начала. Unix-время хорошо переносится между языками, БД и API. Сортировка меток — сортировка целых; разницы — вычитание.
Цена — читаемость для людей: 1710000000 мало что говорит, пока не преобразовать. Инструменты и форматтеры библиотек закрывают разрыв.
Секунды против миллисекунд против наносекунд
Соглашения различаются:
| Единица | Типичное применение | Длина примера (2020-е) |
|---|---|---|
| Секунды | POSIX, многие API | 10 цифр |
| Миллисекунды | JavaScript Date, некоторые БД | 13 цифр |
| Микро/нано | Высокоразрешающие метрики | более длинные целые |
Передача миллисекунд в API, ожидающее секунды, даёт даты далеко в будущем. Секунды в миллисекундный API попадают около 1970. При интеграции сверяйте документацию и тестируйте известным моментом.
Date.now() в JavaScript возвращает миллисекунды. Многие backend-фреймворки по умолчанию используют секунды. Явно указывайте единицы в именах JSON (createdAtSeconds), когда возможно.
UTC и локальное отображение
Сама метка основана на UTC. Показ в Берлине или Токио применяет преобразование пояса для людей; хранимое целое не меняется. Храните UTC-мгновения и локализуйте на краях—UI, письма, отчёты.
Отрицательные метки и далёкое будущее
Метки до 1970 отрицательны на поддерживающих системах. Далеко в будущем возможны переполнения 32-битных signed integer: классическая проблема года 2038 для time_t на 32-битных платформах. Современный 64-битный time_t отодвигает переполнение далеко за практический горизонт при секундном разрешении. Предпочитайте 64-битные типы в новых системах.
Високосные секунды (уровень осведомлённости)
UTC иногда вставляет високосные секунды. POSIX Unix-время обычно их игнорирует, считая каждый день 86 400 секундами. Для повседневных бизнес-приложений этого достаточно. Для астрономии, телекома или юридического штампования на секунду через скачки изучите шкалу вашей отрасли (UTC, TAI, GPS time) и поддержку библиотек.
ISO 8601 рядом с Unix-временем
API часто принимают оба формата:
17100000002024-03-09T16:00:00Z
Строки ISO 8601 с Z или числовым смещением передают тот же момент при корректном разборе. Unix-время компактно; ISO-строки удобно искать в логах. Многие системы хранят целые и отдают ISO в JSON.
Процесс преобразования
- Определить единицу (с/мс).
- Интерпретировать число как UTC-эпоху.
- Форматировать с явным поясом для отображения.
- Круговой проход: формат → разбор или обратно в эпоху для проверки согласия.
Ручное преобразование без библиотеки ошибочно около длин месяцев и високосных лет—в продакшене используйте проверенные библиотеки.
Базы данных и индексы
Храните целые эпохи или нативные типы timestamp с нормализацией к UTC. Избегайте локального гражданского времени без пояса, если имеется в виду мгновение. Индексация целых эпох проста; документируйте единицу в комментариях схемы.
Для «бизнес-дат» вроде календарных дней счёта тип date без времени может быть лучше эпохи в полночь—политика и юрисдикция определяют, что значит «день».
Логирование и наблюдаемость
Процессоры логов любят Unix-время. Коррелируйте трассы между сервисами в одной доменной часовой зоне по возможности. Перекос часов между хостами остаётся—NTP помогает—терпите малые отрицательные в длительностях и предпочитайте серверные метки для авторитетных audit trail.
Частые ошибки
- Несовпадение единиц (секунды vs миллисекунды).
- Эпоха как локальное при форматировании без
Z. - Арифметика строк дат вместо мгновений.
- Excel преобразует метки с неверной эпохой (нулевой день Excel отличается).
- Переполнение 32 бит на встраиваемых или устаревших системах.
Учебный пример
Возьмите метку, преобразуйте в UTC, затем в два гражданских пояса. Убедитесь, что обе гражданские строки относятся к одному мгновению. Это упражнение даёт интуицию лучше заучивания формул.
Используйте from-unix-timestamp-to-date для просмотра значений из API или дампов БД (несекретные образцы).
Связанные понятия
- Монотонные часы измеряют прошедшее время и не должны идти назад; это не Unix-метки и их не следует сохранять как настенное время.
- Cron-выражения описывают гражданские расписания, не эпохи.
- Поля
notAfterсертификатов — мгновения; сравнивайте их в UTC.
Итог
Unix-метки кодируют мгновения как счётчики от 1970-01-01 UTC. Они упрощают хранение и сортировку, вынося человеческое форматирование на края. Знайте единицы, используйте 64-битные типы, показывайте с явными поясами и преобразуйте надёжными инструментами, когда сырое число нужно прочитать как календарную дату.