0
1970-01-01T00:00:00Z
946684800
2000-01-01T00:00:00Z
2147483647
2038-01-19T03:14:07Z — max for 32-bit signed int
9223372036854775807
~292 billion years — no practical overflow
86400000
60 × 60 × 24 × 1000
31536000
365 × 24 × 60 × 60 (non-leap)
2024-01-15T12:30:00Z
YYYY-MM-DDTHH:MM:SSZ — widely recommended
2024-01-15T07:30:00-05:00
YYYY-MM-DDTHH:MM:SS±HH:MM
Mon, 15 Jan 2024 12:30:00 +0000
Used in email headers and HTTP headers
2024-01-15T12:30:00.000Z
Subset of ISO 8601 with milliseconds
Mon, 15 Jan 2024 12:30:00 GMT
Used in HTTP headers (Last-Modified, Date)
01/15/2024
Ambiguous — avoid in APIs
15/01/2024
Ambiguous — avoid in APIs
2024-01-15
SQL DATE type, BigQuery, Redshift
20240115123000
Lexicographically sortable
Date.now()
Returns milliseconds since epoch
Math.floor(Date.now() / 1000)
Returns whole seconds
new Date(ts * 1000).toISOString()
Multiply by 1000 if ts is in seconds
Math.floor(new Date('2024-01-15T12:30:00Z').getTime() / 1000)import time; time.time()
Returns float with sub-second precision
from datetime import datetime, timezone datetime.fromtimestamp(ts, tz=timezone.utc)
Always pass tz=timezone.utc to avoid local timezone
from datetime import datetime, timezone
datetime.fromisoformat('2024-01-15T12:30:00+00:00').timestamp()SELECT EXTRACT(EPOCH FROM NOW())::BIGINT;
Returns whole seconds
SELECT to_timestamp(1705319400);
SELECT UNIX_TIMESTAMP();
SELECT FROM_UNIXTIME(1705319400);
time.Now().UnixNano()
Nanoseconds precision
time.Now().Unix()
SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs()
time()
Returns seconds; microtime(true) for float
date +%s
GNU/BSD date; on macOS same command works
+00:00
Coordinated Universal Time — no DST
-05:00 / -04:00
EST in winter, EDT in summer (DST)
-06:00 / -05:00
-07:00 / -06:00
-08:00 / -07:00
+00:00 / +01:00
BST (British Summer Time) in summer
+01:00 / +02:00
Germany, France, Italy, Poland, etc.
+05:30
No DST — half-hour offset
+08:00
No DST — entire country one timezone
+09:00
No DST
+10:00 / +11:00
DST in southern hemisphere summer (Oct–Apr)
+12:00 / +13:00
| Единица | Цифры | Пример | Диапазон прибл. |
|---|---|---|---|
| Seconds (s) | 10 | 1705319400 | 1970 – 2286 |
| Milliseconds (ms) | 13 | 1705319400000 | 1970 – 2286 (×1000) |
| Microseconds (μs) | 16 | 1705319400000000 | Sub-second precision |
| Nanoseconds (ns) | 19 | 1705319400000000000 | Used by Go, Rust, Linux kernel |
Unix-метки времени всегда в UTC. Они не содержат информации о часовом поясе. На самом деле это преимущество — обеспечивается универсальная точка отсчёта.
Путаница возникает при преобразовании меток времени в человекочитаемые даты:
const ts = 1700000000;
const date = new Date(ts * 1000);
date.toUTCString(); // "Tue, 14 Nov 2023 22:13:20 GMT"
date.toLocaleString(); // Depends on user's local time zone
date.toISOString(); // "2023-11-14T22:13:20.000Z"
Лучшая практика: храните и передавайте метки времени в UTC. Конвертируйте в местное время только на уровне отображения, максимально близко к пользователю.
-- Current timestamp
SELECT EXTRACT(EPOCH FROM NOW());
-- Timestamp to date
SELECT TO_TIMESTAMP(1700000000);
-- Date to timestamp
SELECT EXTRACT(EPOCH FROM '2023-11-14'::timestamp);
Если дата отображается как январь 1970 года, вы, вероятно, передали секунды там, где ожидались миллисекунды (или наоборот). Всегда проверяйте, какую точность ожидает API.
При хранении меток времени в виде чисел с плавающей запятой можно потерять точность выше миллисекунд. Для микро- или наносекундной точности используйте целые числа с соответствующим множителем.
Unix-метки времени не учитывают секунды координации. Unix-день всегда составляет ровно 86 400 секунд, хотя реальные дни UTC иногда содержат 86 401 секунду. Для большинства приложений это несущественно. Для научных или спутниковых приложений используйте TAI (Международное атомное время).
Храните даты как метки времени (целые числа или нативные типы даты) для эффективной сортировки, сравнения и арифметики. Форматированные строки сложнее правильно сортировать и запрашивать. Большинство баз данных имеют нативные типы для работы с датами. Оставьте строковое форматирование для отображения и ответов API.
Unix-таймстемп (также называемый временем epoch) — это количество секунд, прошедших с 00:00:00 UTC 1 января 1970 года, без учёта високосных секунд. Это единственное целое число, однозначно идентифицирующее любой момент времени, независимо от часового пояса.
Традиционные Unix-таймстемпы считают целые секунды. Современные языки и API (JavaScript Date.now(), Java System.currentTimeMillis()) используют миллисекунды — в 1000 раз больше — для точности ниже секунды. При взаимодействии всегда проверяйте порядок величины: 10-значное число — секунды, 13-значное — миллисекунды.
32-битные знаковые целые числа могут представлять таймстемпы до 2 147 483 647, что соответствует 03:14:07 UTC 19 января 2038 года. После этого момента 32-битные системы переполнятся до отрицательных значений. 64-битные системы могут безопасно представлять даты значительно за пределами 292 миллиардного года.
В JavaScript: new Date(ts * 1000).toISOString(). В Python: datetime.fromtimestamp(ts, tz=timezone.utc).isoformat(). В SQL (PostgreSQL): to_timestamp(ts). Формат ISO 8601 для UTC — YYYY-MM-DDTHH:MM:SSZ, например 2024-01-15T12:30:00Z.