Как это возможно и как с этим бороться? Я делаю резервный скрипт, зависящий от Unix date
и обнаружили интересную ошибку:
[root@web000c zfs_test]# date +%y-%m-%d --date='2 months ago'
14-04-01
[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago'
14-02-28
[root@web000c zfs_test]# date
Sun Jun 1 00:08:50 CEST 2014
Вы наблюдаете такое поведение из-за летнего времени (переход на летнее время).
Поскольку вы сейчас находитесь в летнем времени, когда ваши часы на один час впереди, когда вы запрашиваете три месяца назад сразу после полуночи первого июня, время оказывается на час «раньше», потому что было не летнее время три. несколько месяцев назад.
Документация GNU date предлагает обойти это используя 12:00 и 15 числа месяца в качестве отправных точек при запросе относительных дней или месяцев, соответственно. Например:
date +%y-%m-%d --date="$(date +%Y-%m-15) -3 month"
Если абсолютное время является вашей главной заботой, вероятно, лучше отрабатывать универсальное глобальное время поскольку он существует для этой цели. Ответ Майкла очень полезен, когда вам нужно работать над проблемой, но обычно рекомендуется избегать ее полностью там, где это возможно.
Если ваша система не настроена на UTC по умолчанию, самый простой способ передать часовой пояс - это добавить к вашей команде префикс TZ
переменная окружения. Это ограничивает переключение зоны одной командой и предотвращает попадание переменной в ваши последующие команды.
$ NOW=$(date '+%s')
$ date -d @$NOW
Wed Jun 11 23:44:35 EDT 2014
$ TZ=UTC date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014
Что ты не должен делать это экспортировать TZ
переменная, так как это может сильно запутать устранение неполадок, как показано ниже.
$ export TZ=UTC
$ date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014
$ TZ=EDT date -d @$NOW
Thu Jun 12 03:44:35 EDT 2014
В этот конкретный год, в который, по вашему мнению, работает компьютер, и в конкретную дату, выбранную вами для теста «1 месяц назад, 2 месяца назад и 3 месяца назад, да - это, скорее всего, обнаружение 29 февраля. Не всегда ошибка, но ..
Сегодня НЕ 2014-06-01. Попробуй еще раз. Установите дату компьютера на 2013-06-01. Попробуй еще раз.
Установите дату компьютера на 2014-09-01. Попробуй еще раз.