Все знают команду date для работы с датами/временем.

Очень удобная команда, имеет очень много форматов и позволяет складывать/вычитать даты, например:

date -d"-1 day" # Чт 02 янв 2025 21:52:15 MSK - текущая дата минус один день.
date -d"+2 week" # Пт 17 янв 2025 21:53:48 MSK - текущая дата плюс две недели.
"day", "week", "month", "year", "hour", "min", "sec"

Но в bash есть еще средства для работы со временем:

Переменная SECONDS показывает, сколько секунд прошло с начала запуска скрипта или момента задания значения переменной. Обычно используется для хронометража блока кода скрипта. Например:

SECONDS=0
# здесь блок длительного кода
echo $SECONDS

Переменная EPOCHSECONDS - показывает число секунд, прошедших с начала эпохи UNIX (01.01.1970 00:00:00 UTC).

Обратите внимание, число секунд не зависит от часового пояса.

EPOCHREALTIME - аналогична предыдущей, но секунды с точностью до микросекунды. С помощью этой переменной можно точно отслеживать время небольших кусков кода. Даже если просто вывести переменную дважды - будет разное время:

echo $EPOCHREALTIME $EPOCHREALTIME
# 1744652451,166523 1744652451,166539

Обратите внимание, разделитель дробной части может быть различным, в зависимости от языковых настроек.

Переменные EPOCHSECONDS и EPOCHREALTIME обнулить не получится.

И еще есть специальный формат оператора printf для преобразования секунд UNIX в формат дат:

printf '%(DT_FORMAT)T' $EPOCHSECONDS

DT_FORMAT - практически полностью совпадает с форматом команды date.

Например:

printf '%(%Y%m%d-%H%M%S)T' $EPOCHSECONDS
# 20250414-203214

Если не указать переменную или указать -1 - будет использована текущая дата/время. Если указать -2 - будет использовано время начала работы этого экземпляра bash.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
printf удобен тем, что выполняется гораздо быстрее чем date (хотя говорить о скорости bash немного смешно) и позволяет результат операции записать сразу в переменную (Например DT).
printf -v DT '%(%Y%m%d-%H%M%S)T'

И date и printf работают в локальной временно́й зоне, чтобы это изменить можно задать “врéменную переменную” TZ.

Например:

TZ='UTC' date
# Пн 14 апр 2025 16:15:57 UTC

TZ='Asia/Irkutsk' printf '%(%Y%m%d-%H%M%S)T\n'
# 20250415-001621

Полный список временны́х зон на системах с systemd можно получить с помощью команды timedatectl list-timezones.