Почему эти две команды даты дают разные результаты?

9
$ date -d "Apr 1 2016 - 1 month" +%B

дает мне «март», и это здорово - месяц, предшествующий апрелю, - март. Если я сделаю это, однако:

$ date -d "$(date -d "Apr 1 2016") - 1 month" +%B

это дает мне "февраль". Это вызывает ошибку в более сложном коде, который у меня есть. Почему эти 2 команды показывают разные результаты?

Tal
источник
Оба дали мнеMarch
cuonglm
1
Как объяснил Томас, это зависит от вашего часового пояса. Мой DST меняется 13 марта - ваш, вероятно, нет, поэтому вы можете не видеть это поведение в те же даты, или, возможно, вообще, если у вас нет изменений DST.
Тал

Ответы:

11

Вы можете увидеть проблему, включив трассировку оболочки:

+ date -d 'Apr 1 2016 - 1 month' +%B
March
++ date -d 'Apr 1 2016'
+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month' +%B
February

Когда вы используете выходные данные внутренней dateкоманды, это происходит в самом начале апреля, и при вычитании месяца возникает разрыв, связанный с изменением EST / EDT:

+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month'
Mon Feb 29 23:00:00 EST 2016

Ваши результаты, конечно, будут зависеть от ваших настроек местного часового пояса. Включение трассировки покажет часовой пояс (в моем случае, EDT).

Причина, по которой результаты отличаются, заключается в том, что в последнем случае вы дали больше информации date, сделали ее параметр более конкретным , то есть конкретное время суток. В первой части это не было указано, что дает dateбольше возможностей для определения даты / времени для отображения.

Томас Дики
источник
Теперь я понимаю, что это связано с переходом на летнее время (мое здесь: timeanddate.com/time/zone/canada/edmonton ), но я до сих пор не понимаю, почему команда date интерпретирует одну и ту же дату по-разному в скорлупе, чем в основной оболочке. Если я запускаю скрипт с:, date -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")"я получаю точно такой же результат, включая один и тот же тег часового пояса - почему удаление месяца из обоих дает разные результаты?
Тал
О - твое последнее редактирование проясняет. Спасибо
Тал