CLI AI

Перевести unix-время в дату из командной строки

2026-08-18

date -d @1787043600 печатает дату для метки времени, а date -u -d '2026-08-18 09:00:00' +%s переводит обратно. Работать это будет или нет, решают две детали: на macOS вместо -d @ нужен -r, а миллисекундную метку сначала делят на 1000, иначе date просто откажется её принимать.

1. Метка времени в дату

clai
$ clai переведи 1787043600 в дату→ date -d @1787043600Tue Aug 18 09:00:00 UTC 2026

Символ @ перед числом обязателен: он говорит date, что это секунды с 1970 года, а не строка с датой. Результат — в часовом поясе машины.

2. Явно в UTC

clai
$ clai покажи 1787043600 в UTC→ date -u -d @1787043600Tue Aug 18 09:00:00 UTC 2026

-u прибивает вывод к UTC, как бы ни была настроена машина. В переписке по инциденту это единственный способ прекратить спор о том, чей это был час.

3. В нужном часовом поясе

clai
$ clai покажи это время в Берлине→ TZ=Europe/Berlin date -d @1787043600Tue Aug 18 11:00:00 CEST 2026

Переменная TZ перед командой действует только на неё. Названия берите из базы IANA (Europe/Berlin, America/New_York), а не аббревиатуры вроде CEST — они неоднозначны.

4. Обратно: дата в метку

clai
$ clai переведи 18 августа 2026 09:00 UTC в unix-время→ date -u -d '2026-08-18 09:00:00' +%s1787043600

+%s — формат вывода «секунды с начала эпохи». Без -u строка даты будет разобрана в часовом поясе машины, и число получится другим.

5. В формате ISO 8601

clai
$ clai выведи метку в формате ISO→ date -u -Is -d @17870436002026-08-18T09:00:00+00:00

-Is — сокращение от --iso-8601=seconds. Этот формат разбирает почти любой язык программирования без дополнительных усилий.

6. Метка в миллисекундах

clai
$ clai переведи метку в миллисекундах 1787043600123→ ms=1787043600123; date -u -d @$((ms/1000)) +"%F %T.$((ms%1000))"2026-08-18 09:00:00.123

JavaScript, Java и большинство API отдают миллисекунды. Целочисленное деление даёт секунды, а остаток — дробную часть, которую date сам не напечатает.

Gotchas

  • Миллисекунды date не понимает. Проверено: date -u -d @1787043600123 отвечает date: invalid date '@1787043600123'. Число не из далёкого будущего — это 2026 год, умноженный на тысячу.
  • На macOS флаг другой. GNU: date -d @1787043600. BSD и macOS: date -r 1787043600. Скрипт, написанный на Linux, на маке молча напечатает сегодняшнюю дату или упадёт — ставьте coreutils из Homebrew и зовите gdate, если нужен единый синтаксис.
  • Без -u вы переводите в чужой часовой пояс. Одна и та же метка на сервере в UTC и на ноутбуке в Берлине отличается на два часа — это видно выше. В отчётах об инцидентах зону фиксируйте всегда.

Related questions

Как получить текущую метку? date +%s. Для миллисекунд в GNU есть date +%s%3N, в BSD такого формата нет.

Как посчитать разницу между двумя датами? Перевести обе в секунды и вычесть: между 11 и 18 августа 2026 года получается 604800 секунд, ровно неделя.

Что за проблема 2038 года? Знаковое 32-битное поле секунд переполнится 19 января 2038 года. На 64-битных системах и в современных языках вопрос закрыт, но в старых бинарных форматах он ещё встречается.

See also

CliAI превращает «что за время 1787043600» в правильный флаг для вашей системы и показывает его до запуска. Поставить одной строкой.