bash: Конвертация даты-времени в секунды, а затем обратно в дату-время

Вопрос или проблема

В 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 будет значительно проще, если вы запомните об этом нюансе при работе с временными метками.

Оцените материал
Добавить комментарий

Капча загружается...