Вопрос или проблема
В bash-скрипте, который преобразует метки времени в секунды, добавляет некоторые секунды и преобразует результат обратно в метку времени, я получаю неверный результат от команды date. Это причина:
$ dt=$(date '+%s' -u --date="2024-11-25 20:31:00")
$ echo $dt
1732566660
$ date '+%F %T' -u --date="$dt seconds"
2079-10-21 22:33:33
Что я делаю не так?
Чтобы предоставить Unix-время (секунды с начала эпохи) в качестве входного параметра для date
, добавьте к нему @
:
$ TZ=UTC date -d @1732566660
Пн 25 Нояб 20:31:00 UTC 2024
Чтобы увидеть, что date
на самом деле сделала с вашим вводом, используйте --debug
, который сообщит вам, что она поняла “n секунд” как “+n секунд от текущего момента”:
$ date '+%F %T' -u --date="$dt seconds" --debug
date: разобрана относительная часть: +1732566660 секунд
date: часовой пояс ввода: значение переменной окружения TZ="UTC0" или -u
date: используется текущее время в качестве исходного значения: '03:48:36'
date: используется текущая дата в качестве исходного значения: '(Y-M-D) 2024-11-26'
date: начальная дата/время: '(Y-M-D) 2024-11-26 03:48:36'
date: '(Y-M-D) 2024-11-26 03:48:36' = 1732592916 epoch-seconds
date: после корректировки времени (+0 часов, +0 минут, +1732566660 секунд, +0 нс),date: новое время = 3465159576 epoch-seconds
date: часовой пояс: Всемирное время
date: окончательно: 3465159576.849887587 (epoch-seconds)
date: окончательно: (Y-M-D) 2079-10-22 00:19:36 (UTC)
date: окончательно: (Y-M-D) 2079-10-22 00:19:36 (UTC+00)
date: выходной формат: ‘%F %T’
2079-10-22 00:19:36
.
Ответ или решение
Вопрос, связанный с конверсией меток времени в секунды и обратно, представляет собой распространённую задачу при работе с Bash и командой date
. Рассмотрим, что именно произошло в вашем примере.
Проблема с конверсией времени
Вы преобразовали дату и время в количество секунд с начала эпохи Unix (1 января 1970 года) корректным образом:
dt=$(date '+%s' -u --date="2024-11-25 20:31:00")
echo $dt
В результате вы получили значение 1732566660
, что соответствует указанной дате и времени, и это правильный шаг.
Однако, когда вы пытаетесь вернуть это количество секунд обратно в формат даты, вы используете конструкцию:
date '+%F %T' -u --date="$dt seconds"
Здесь содержится ошибка. Команда date
интерпретирует строку "$dt seconds
" как относительное смещение от текущего времени, а не как абсолютное значение времени в секундах. Это и есть причина, по которой результат выхода отличается от ожидаемого.
Правильный способ конверсии
Для того чтобы преобразовать количество секунд в дату обратно, вам нужно проставить перед значением @
, чтобы указать, что это абсолютное значение времени. Правильный синтаксис будет выглядеть следующим образом:
TZ=UTC date -d @$dt
Таким образом, выполняя следующую команду, вы получите корректный результат:
TZ=UTC date -d @$dt
Выход будет:
Mon 25 Nov 20:31:00 UTC 2024
Использование флага --debug
Чтобы понять, как команда date
интерпретирует ваши входные данные, можно использовать флаг --debug
, который поможет вам диагностировать проблему. Пример использования:
date '+%F %T' -u --date="$dt seconds" --debug
В результате выполнения этой команды вы сможете увидеть, что date
обрабатывает вашу строку как относительное время, исходя из текущего времени.
Вывод
Таким образом, чтобы преобразовать метки времени в секунды и обратно, вам необходимо понимать, как правильно указывать время для команды date
. Используйте символ @
перед значением секунд для указания на то, что это абсолютное время.
Надеемся, что эти разъяснения помогли вам понять причину проблемы и способы её решения. Ваша работа с Bash будет значительно проще, если вы запомните об этом нюансе при работе с временными метками.