linux-labs

Вики / Базовые команды

date (дата и время в shell)

Форматирование дат, метки времени для файлов и логов, арифметика дат.

date выводит и форматирует дату/время. В скриптах (bash-scripting) — для меток в именах файлов бэкапов и логов. (Системное время и таймзону настраивает timedatectl.)

date                              # текущая дата/время (в локальной зоне)
date -u                          # в UTC
date +%Y-%m-%d                    # 2026-06-30 (по формату)
TZ='America/New_York' date        # показать в другой таймзоне разово
date +%F                          # 2026-06-30  (=%Y-%m-%d)
date +%T                          # 14:30:05    (=%H:%M:%S)
date +%Y%m%d-%H%M%S               # 20260630-143005 (для имён файлов)
date +%s                         # Unix timestamp (секунды с 1970)
date -d @1700000000              # timestamp → человекочитаемо
date -Iseconds                   # ISO 8601: 2026-06-30T14:30:05+03:00
date -R                          # RFC 5322 (для почты/HTTP)
date '+%A, %d %B %Y'             # день недели и месяц словами (по локали, см. locale)

Спецификаторы: %Y/%m/%d год/месяц/день, %H:%M:%S время, %s epoch, %F/%T дата/время, %j день года, %A/%B день недели/месяц словами, %z смещение.

# имя бэкапа с датой
tar czf "backup-$(date +%F).tar.gz" /etc        # %F = %Y-%m-%d

# относительные даты (-d)
date -d "yesterday" +%F
date -d "now + 2 hours" +%T
date -d "2026-01-01 + 30 days" +%F
date -d "last monday" +%F

# разница: через timestamp'ы
echo $(( ($(date -d "2026-07-01" +%s) - $(date +%s)) / 86400 ))   # дней до даты

# выставить системное время вручную (обычно не нужно — есть NTP):
sudo date -s "2026-06-30 14:00:00"        # лучше через timedatectl

В имени файла оказались пробелы/двоеточия

date по умолчанию печатает с пробелами/: (плохо для имён). Используй формат: date +%Y%m%d-%H%M%S или %F.

Время не то / не та зона

date берёт системную зону. Проверь/смени через timedatectl; для UTC — date -u; разово в другой зоне — TZ='Europe/London' date. Сбитые часы — NTP в timedatectl.

Месяц/день словами на английском, а нужен русский

Зависит от локали (LC_TIME). Установи нужную локаль (см. locale): LC_TIME=ru_RU.UTF-8 date '+%A %d %B'.

Нужна дата в логах скрипта

printf '%s %s\n' "$(date -Iseconds)" "сообщение" или используй журнал systemd (journalctl сам ставит таймстампы).

date +%F                          # 2026-06-30 (=%Y-%m-%d)
date +%Y%m%d-%H%M%S               # метка для имён файлов
date +%s ; date -d @TS            # epoch ↔ человекочитаемо
date -d "yesterday" +%F ; date -d "now + 1 hour" +%T
TZ='UTC' date ; date -Iseconds    # другая зона / ISO 8601
tar czf "bk-$(date +%F).tgz" /etc # дата в имени бэкапа

См. также