Warum liefern diese beiden Datumsbefehle unterschiedliche Ergebnisse?


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

gibt mir "März", was großartig ist - der Monat vor April ist März. Wenn ich das aber mache:

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

es gibt mir "Februar". Dies verursacht einen Fehler in einem komplexeren Code, den ich habe. Warum zeigen diese beiden Befehle unterschiedliche Ergebnisse?


Beide gaben mirMarch
cuonglm

1
Wie von Thomas erklärt, hängt dies von Ihrer Zeitzone ab. Meine Sommerzeit ändert sich am 13. März - Ihre wahrscheinlich nicht, sodass Sie dieses Verhalten möglicherweise nicht an denselben Daten oder möglicherweise überhaupt nicht sehen, wenn Sie keine Sommerzeitänderungen haben.
Tal

Antworten:


11

Sie können das Problem erkennen, indem Sie die Shell-Ablaufverfolgung aktivieren:

+ 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

Wenn Sie die Ausgabe des inneren dateBefehls verwenden, ist dies Anfang April, und wenn Sie einen Monat subtrahieren, tritt aufgrund von EST / EDT-Änderungen eine Diskontinuität auf:

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

Ihre Ergebnisse hängen natürlich von Ihren lokalen Zeitzoneneinstellungen ab. Wenn Sie den Trace aktivieren, wird die Zeitzone angezeigt (in meinem Fall EDT).

Der Grund, warum sich die Ergebnisse unterscheiden, besteht darin, dass Sie im letzteren Fall mehr Informationen gegeben haben date, um den Parameter spezifischer zu machen , dh die spezifische Tageszeit. Im ersten Teil wurde dies nicht angegeben, wodurch datemehr Spielraum für die Bestimmung des Datums / der Uhrzeit für die Anzeige gegeben wurde.


Mir ist jetzt klar, dass dies mit der Sommerzeit zu tun hat (meine sind hier: timeanddate.com/time/zone/canada/edmonton ), aber ich verfolge immer noch nicht, warum der Datumsbefehl das gleiche Datum unterschiedlich zu interpretieren scheint in einer Unterschale als in der Hauptschale. Wenn ich ein Skript mit: ausführe date -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")", erhalte ich genau das gleiche Ergebnis, einschließlich des gleichen Zeitzonen-Tags. Warum führt das Entfernen eines Monats von beiden zu unterschiedlichen Ergebnissen?
Tal

Oh - deine letzte Bearbeitung macht es klar. Danke
Tal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.