Как это работает
Unix-время считает секунды с 1 января 1970 года, 00:00:00 UTC (эпохи Unix), не учитывая високосные секунды. В один и тот же момент это одно и то же число по всему миру, поэтому серверы, базы данных и журналы хранят время именно так, а часовые пояса оставляют для отображения.
Многие системы считают в более мелких единицах: JavaScript и Java — в миллисекундах, некоторые базы данных и средства трассировки — в микросекундах, Go и интерфейсы ядра Linux часто — в наносекундах. Конвертер различает их по длине: timestamp в секундах для любой даты с 2001 по 2286 год содержит 10 цифр, в миллисекундах — 13, в микросекундах — 16, в наносекундах — 19. Для дат, далёких от сегодняшней, выберите единицу сами.
Дата показывается в UTC, в часовом поясе вашего браузера и в выбранном вами, на основе базы часовых поясов браузера, поэтому летнее время применяется так, как действовало в ту дату. ISO 8601 — формат для данных и API; RFC 2822 используется в заголовках e-mail.
Пример
1700000000 — это 14 ноября 2023 года, 22:13:20 UTC: 2023-11-14T22:13:20Z в ISO 8601 и Tue, 14 Nov 2023 22:13:20 +0000 в RFC 2822. В Нью-Йорке в тот момент было 17:13:20 того же дня, в Индии — 03:43:20 следующего. Тот же момент в миллисекундах — 1700000000000.
Unix-время в коде
Текущее epoch-время и перевод epoch обратно в дату в языках, на которых чаще всего работают серверы:
# Bash (GNU date; macOS: date -r 1700000000)
date +%s
date +%s%3N # milliseconds
date -d @1700000000
# Python
import time; int(time.time())
from datetime import datetime, timezone; datetime.fromtimestamp(1700000000, timezone.utc)
// JavaScript
Math.floor(Date.now() / 1000)
new Date(1700000000 * 1000).toISOString()
<?php
time();
date('c', 1700000000);
-- SQL
SELECT UNIX_TIMESTAMP(); -- MySQL, MariaDB
SELECT EXTRACT(EPOCH FROM now())::bigint; -- PostgreSQL
SELECT unixepoch(); -- SQLite 3.38+
SELECT to_timestamp(1700000000); -- PostgreSQL: epoch to dateВопросы
Что такое epoch-время?
Epoch-время, оно же Unix-время, — это число секунд, прошедших с эпохи Unix: 1 января 1970 года, 00:00:00 UTC. Более ранние даты отрицательные. Почти все операционные системы и языки программирования ведут отсчёт времени от неё, а конвертер epoch вроде этого переводит такое число в читаемую дату и обратно.
Что такое проблема 2038 года?
Программы, которые хранят Unix-время в знаковом 32-битном целом числе, могут считать только до 2 147 483 647, то есть до 19 января 2038 года, 03:14:07 UTC. Секундой позже число переходит в отрицательное и читается как декабрь 1901 года. Современные 64-битные системы используют 64-битный time_t и не затронуты, а вот старые встраиваемые устройства, форматы файлов и столбцы баз данных с 32-битными секундами могут пострадать.
Мой timestamp в секундах или миллисекундах?
Посчитайте цифры. Текущая дата в секундах содержит 10 цифр (1700000000), в миллисекундах — 13 (1700000000000). Date.now() в JavaScript и System.currentTimeMillis() в Java возвращают миллисекунды; date +%s, time() в PHP и int(time.time()) в Python — секунды. Если дата получается в 1970 году или через тысячи лет, единица выбрана неверно.
Есть ли у Unix timestamp часовой пояс?
Нет. В один и тот же момент timestamp — это одно и то же число по всему миру; он всегда отсчитывается от полуночи UTC 1 января 1970 года. Часовой пояс важен только при превращении в календарную дату и время на часах, поэтому конвертер показывает один timestamp в нескольких поясах.
Учитывает ли Unix-время високосные секунды?
Нет. Unix-время считает каждые сутки ровно 86 400 секундами, поэтому 27 високосных секунд, добавленных в UTC с 1972 года (последняя в конце 2016 года), не учитываются. Для журналов и повседневного использования это не важно.