Чому ці команди з двома датами дають різні результати?


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

дає мені "Березень", що чудово - місяць, який настає до квітня, - березень. Якщо я все-таки це зробити:

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

це дає мені "лютий". Це викликає помилку в якомусь більш складному коді, який у мене є. Чому ці 2 команди показують різні результати?


Обоє дали мені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 -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")"я отримую точно такий же результат, включаючи один і той же тег часового поясу - чому вилучення місяця з обох дає різні результати?
Тал

О, остання редакція дає зрозуміти. Спасибі
Тал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.