С чего начать Первые шаги трек · 15 ступеней
Linux Labs

date — дата и время в shell

4 мин GNU coreutils

Команда date: текущее время, форматы вывода, метки времени для файлов и логов, арифметика дат.

Шпаргалка

9 команд Версия для печати
  • date +%F 2026-06-30 (=%Y-%m-%d)
  • date +%Y%m%d-%H%M%S метка для имён файлов
  • date +%s epoch: секунды с 1970
  • date -d @1700000000 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 дата в имени бэкапа

Обзор

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

bash
date                              # текущая дата/время (в локальной зоне)
date -u                          # в UTC
date +%Y-%m-%d                    # 2026-06-30 (по формату)
TZ='America/New_York' date        # показать в другой таймзоне разово

Ключи

6

Ниже — основные ключи date; полный список — man date (форматные спецификаторы +%… — отдельная тема, см. таблицу в «Рецептах»).

Ключ Что делает Пример
-u --utc Показать время в UTC вместо локальной таймзоны. date -u
-d --date string Показать дату по строке (timestamp, "yesterday", "now + 1 hour"), не текущую. date -d "yesterday" +%F
-I --iso-8601 date|hours|minutes|seconds Вывести дату/время в формате ISO 8601. date -Iseconds
-R --rfc-email Вывести дату в формате RFC 5322 (для почты и HTTP-заголовков). date -R
-s --set string Установить системное время вручную; для обычной синхронизации используй timedatectl. опасно sudo date -s "2026-06-30 14:00:00"
-f --file datefile Прочитать и вывести по одной дате на строку из файла. date -f dates.txt

Ничего не найдено. Попробуй запрос короче.

Рецепты

2

Форматы

bash
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 смещение.

Метки и арифметика

bash
# имя бэкапа с датой
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

Неполадки

4

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

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 сам ставит таймстампы).

См. также

  • timedatectl — Системное время, таймзона и синхронизация по NTP (systemd-timesyncd).
  • bash-scripting — Переменные, условия, циклы, аргументы и безопасный режим set -euo pipefail.
  • files-basics — Навигация и файлы — ls, cd, cp, mv, rm, cat, less, head, tail, копипаст в терминале.
Загрузка…