3

У меня есть сценарий оболочки, который запускается через crontab, но команды в нем зависят от часового пояса (они обновляют таблицу в базе данных каждый день. Если скрипт выполняется во время изменения летнего времени, он будет реплицировать несогласованный период данных.

Я планирую использовать скрипт-обертку, который:

  1. Проверяет, отличается ли часовой пояс между сегодняшним и завтрашним днем
  2. запускает дочерний скрипт, только если первая проверка возвращает false (он не отличается)

Существует много информации об изменении часового пояса, но ничего о проверке изменения часового пояса в linux/bash.

2 ответа2

3

Следующие тесты, изменился ли местный часовой пояс со вчерашнего дня:

[ "$(date -d "yesterday" '+%z')" = "$(date '+%z')" ]

Формат %z запрашивает дату для возврата часового пояса. Выше сравнивается результат за сегодня с результатом за вчерашний день.

Как это использовать

Команду test можно использовать для управления выполнением оператора:

$ [ "$(date -d "yesterday" '+%z')" = "$(date '+%z')" ] && echo "No change"
No change

Или же,

$ if [ "$(date -d "yesterday" '+%z')" = "$(date '+%z')" ]; then  echo "No change"; fi
No change

Как это устроено

Вывод из формата %z выглядит следующим образом:

$ date '+%z'
-0800
$ date -d yesterday '+%z'
-0800

Вышеуказанное указывает на 8-часовое отставание от GMT. Это отставание зависит от того, находимся ли мы в летнее время или стандартное время. Например:

$ date -d "nov 1, 2014" '+%z'
-0700

[ указывает text команду bash. Следующая команда сравнивает результаты сегодняшнего и вчерашнего дня:

[ "$(date -d "yesterday" '+%z')" = "$(date '+%z')" ]
0

Просто пояснение: date -d yesterday +%z скажет вам, сообщал бы вчера вчера другое время суток за то же время, что и сегодня, предполагая, что система была установлена на тот же часовой пояс вчера. Он не скажет вам, мог ли кто-то заменить /etc /localtime другим системным часовым поясом по умолчанию.

Строго говоря, переход на летнее время - это не смена часового пояса, а просто смещение часового пояса от UTC. Это все тот же часовой пояс.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .