Все знают команду 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.
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.








Комментарии