← Весь справочник

date

Текущее время в любом формате, разбор и арифметика дат (-d), Unix time и часовые пояса (TZ=)

date печатает текущее время, а с -d — любую другую дату: разбирает строку вроде 2025-01-15 10:00, yesterday или @1700000000, может прибавить интервал и вывести результат в нужном формате. Это GNU date из coreutils: на macOS и в BusyBox опции другие.

Синтаксис

date [опции] [+ФОРМАТ]

Формат начинается с + и состоит из обычного текста и спецификаторов %x. Если в формате есть пробелы — бери его в кавычки: date '+%F %T'.

Опции

ОпцияЧто делает
-d 'строка' / --date=показать не «сейчас», а указанную дату
-uвремя в UTC (как TZ=UTC)
-I / -Iseconds / -InsISO 8601: 2025-01-05, 2025-01-05T14:07:09+00:00; ещё -Ihours, -Iminutes
-RRFC 5322 (для почты и HTTP): Sun, 05 Jan 2025 14:07:09 +0000
--rfc-3339=seconds2025-01-05 14:07:09+00:00; ещё date, ns
-r файлвремя последнего изменения файла
-f файлразобрать каждую строку файла как -d
-s 'строка'установить системное время (нужны права; в контейнере — Operation not permitted)
--debugпоказать, как date понял строку из -d

Спецификаторы формата

СпецификаторЧто даёт (для 2025-01-05 14:07:09 UTC)
%Y / %y / %Cгод 2025 / 25 / век 20
%mмесяц 01
%d / %eдень месяца 05 / 5 (с пробелом)
%H / %kчас 00–23 14 / с пробелом вместо нуля
%I / %lчас 01–12 02 / 2
%p / %PPM / pm
%M / %Sминуты 07 / секунды 09
%Nнаносекунды 000000000; %3N — миллисекунды
%sUnix time — секунды с 1970-01-01 UTC: 1736086029
%jдень года 005
%u / %wдень недели: 1–7, понедельник = 1 / 0–6, воскресенье = 0
%a / %ASun / Sunday
%b / %BJan / January
%V / %Gномер недели ISO / год ISO-недели
%Uномер недели, неделя с воскресенья
%qквартал 1
%Z / %z / %:zпояс UTC / +0000 / +00:00
%F%Y-%m-%d → 2025-01-05
%T%H:%M:%S → 14:07:09
%R%H:%M → 14:07
%D%m/%d/%y → 01/05/25 (американский порядок)
%cдата и время по локали: Sun Jan 5 14:07:09 2025
%n / %t / %%перевод строки / табуляция / знак %

Модификаторы между % и буквой: %-d — без ведущего нуля (5), %_d — пробел вместо нуля, %^a — заглавными (SUN).

Что понимает -d

СтрокаЗначение
2025-01-15, 2025-01-15 10:30, 2025-01-15T10:30:00конкретная дата и время
20250115, Jan 15 2025, 15 Jan 2025тоже работают
01/02/20252 января (месяц/день/год)
@1700000000Unix time
now, today, yesterday, tomorrowотносительно текущего момента
3 days ago, -7 days, 2 hours, 1 week, 1 monthсдвиг от текущего момента
2025-01-15 3 days / 2025-01-15 -1 monthсдвиг от указанной даты
next monday, last fridayближайший следующий / прошлый день недели
2025-01-15 10:00 +0300время с явным смещением пояса
TZ="Asia/Tokyo" 2025-01-15 09:00время, заданное в другом поясе

Примеры

# дата для имени файла
date +%F                          # 2025-01-05
date +%Y%m%d-%H%M%S               # 20250105-140709

# строка лога
date '+%F %T'

# Unix time сейчас и обратно в дату
date +%s
date -d @1700000000 '+%F %T'

# вчера и неделю назад
date -d yesterday +%F
date -d '7 days ago' +%F

# от указанной даты
date -d '2024-02-28 1 day' +%F    # 2024-02-29 — високосный год учтён

# разница между датами в днях
echo $(( ($(date -d 2025-03-01 +%s) - $(date -d 2025-01-01 +%s)) / 86400 ))   # 59

# то же время в разных поясах
TZ=Europe/Moscow date -d @1700000000 '+%F %T %Z'
TZ=America/New_York date -d @1700000000 '+%F %T %Z'

# перевести время из одного пояса в другой
TZ=Europe/Moscow date -d 'TZ="Asia/Tokyo" 2025-01-15 09:00' '+%F %T'

# время изменения файла
date -r /etc/hostname '+%F %T'

# как date понял строку
date --debug -d 'next friday'

# день недели для списка дат из файла
date -f dates.txt +%A

Подводные камни

  • +N после времени — это часовой пояс. date -d '2024-12-31 10:00 + 2 hours' даёт 09:00: + 2 прочитано как смещение +02. Пиши без плюса: '2024-12-31 10:00 2 hours'.
  • Месяцы разной длины. date -d '2025-01-31 1 month' даст 2025-03-03: 31 февраля «переполнилось» в март. Для «конца месяца» считай от первого числа: date -d "$(date +%Y-%m-01) 1 month -1 day".
  • 01/02/2025 — американский порядок, 2 января. 31/12/2024 — ошибка «invalid date». Используй ISO: 2024-12-31.
  • Несуществующая дата — ошибка, а не перенос. date -d 2025-02-30 вернёт код 1.
  • TZ=UTC-3 — это UTC+3. В POSIX-записи знак обратный. Используй имена из /usr/share/zoneinfo: Europe/Moscow.
  • Неизвестный пояс не ошибка. TZ=Moscow date молча покажет UTC с подписью Moscow. Проверяй, что файл /usr/share/zoneinfo/<имя> существует.
  • -u перекрывает TZ=. TZ=Europe/Moscow date -u … работает в UTC.
  • В песочнице системный пояс — UTC (/etc/localtime → Etc/UTC); локализованных названий месяцев нет, только английские.
  • %N и почти все опции — особенности GNU. В скрипте для macOS или Alpine date -d может не сработать.

См. также

cron · variables · find