date -d @1787043600 печатает дату для метки времени, а date -u -d '2026-08-18 09:00:00' +%s переводит обратно. Работать это будет или нет, решают две детали: на macOS вместо -d @ нужен -r, а миллисекундную метку сначала делят на 1000, иначе date просто откажется её принимать.
1. Метка времени в дату
$ clai переведи 1787043600 в дату→ date -d @1787043600Tue Aug 18 09:00:00 UTC 2026
Символ @ перед числом обязателен: он говорит date, что это секунды с 1970 года, а не строка с датой. Результат — в часовом поясе машины.
2. Явно в UTC
$ clai покажи 1787043600 в UTC→ date -u -d @1787043600Tue Aug 18 09:00:00 UTC 2026
-u прибивает вывод к UTC, как бы ни была настроена машина. В переписке по инциденту это единственный способ прекратить спор о том, чей это был час.
3. В нужном часовом поясе
$ clai покажи это время в Берлине→ TZ=Europe/Berlin date -d @1787043600Tue Aug 18 11:00:00 CEST 2026
Переменная TZ перед командой действует только на неё. Названия берите из базы IANA (Europe/Berlin, America/New_York), а не аббревиатуры вроде CEST — они неоднозначны.
4. Обратно: дата в метку
$ clai переведи 18 августа 2026 09:00 UTC в unix-время→ date -u -d '2026-08-18 09:00:00' +%s1787043600
+%s — формат вывода «секунды с начала эпохи». Без -u строка даты будет разобрана в часовом поясе машины, и число получится другим.
5. В формате ISO 8601
$ clai выведи метку в формате ISO→ date -u -Is -d @17870436002026-08-18T09:00:00+00:00
-Is — сокращение от --iso-8601=seconds. Этот формат разбирает почти любой язык программирования без дополнительных усилий.
6. Метка в миллисекундах
$ 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
- sed -i не работает на macOS
- journalctl: логи одного сервиса
- Посчитать вхождения в логе: grep -c — не тот ответ
CliAI превращает «что за время 1787043600» в правильный флаг для вашей системы и показывает его до запуска. Поставить одной строкой.