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 / -Ins | ISO 8601: 2025-01-05, 2025-01-05T14:07:09+00:00; ещё -Ihours, -Iminutes |
-R | RFC 5322 (для почты и HTTP): Sun, 05 Jan 2025 14:07:09 +0000 |
--rfc-3339=seconds | 2025-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 / %P | PM / pm |
%M / %S | минуты 07 / секунды 09 |
%N | наносекунды 000000000; %3N — миллисекунды |
%s | Unix time — секунды с 1970-01-01 UTC: 1736086029 |
%j | день года 005 |
%u / %w | день недели: 1–7, понедельник = 1 / 0–6, воскресенье = 0 |
%a / %A | Sun / Sunday |
%b / %B | Jan / 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/2025 | 2 января (месяц/день/год) |
@1700000000 | Unix 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 или Alpinedate -dможет не сработать.