Dlaczego te 2 polecenia daty dają różne wyniki?

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

daje mi „marzec”, co jest świetne - miesiącem poprzedzającym kwiecień jest marzec. Jeśli to zrobię:

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

daje mi „luty”. To powoduje błąd w bardziej złożonym kodzie, który mam. Dlaczego te 2 polecenia pokazują różne wyniki?

Tal
źródło
Oba dały miMarch
cuonglm
1
Jak wyjaśnił Thomas, zależy to od strefy czasowej. Moje zmiany DST zmieniają się 13 marca - prawdopodobnie nie, więc możesz nie widzieć tego zachowania w tych samych terminach, a być może wcale, jeśli nie masz żadnych zmian DST.
Tal

Odpowiedzi:

11

Możesz zobaczyć problem, włączając śledzenie powłoki:

+ 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

Gdy użyjesz danych wyjściowych datepolecenia wewnętrznego , nastąpi to na samym początku kwietnia, a kiedy odejmowanie miesiąca spowoduje nieciągłość z powodu zmiany EST / EDT:

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

Twoje wyniki będą się oczywiście różnić w zależności od lokalnych ustawień strefy czasowej. Włączenie śledzenia spowoduje wyświetlenie strefy czasowej (w moim przypadku EDT).

Powodem, dla którego wyniki różnią się, jest to, że w tym drugim przypadku podałeś więcej informacji date, sprecyzowałeś jego parametr , tj. Konkretną porę dnia. W pierwszej części, która nie została określona, ​​dając datewięcej swobody w określaniu daty / godziny do wyświetlenia.

Thomas Dickey
źródło
Teraz zdaję sobie sprawę, że ma to związek z czasem letnim (moje są tutaj: timeanddate.com/time/zone/canada/edmonton ), ale nadal nie rozumiem , dlaczego polecenie daty interpretuje tę samą datę inaczej w podpowłoce niż w głównej powłoce. Jeśli uruchomię skrypt z date -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")":, otrzymam dokładnie ten sam wynik, w tym ten sam tag strefy czasowej - dlaczego usunięcie miesiąca z obu daje różne wyniki?
Tal
Och - twoja ostatnia edycja wyjaśnia. Dzięki
Tal