Warum gibt es einen Unterschied zum Unix-Datum zwischen 2 und 3 Monaten?

16

Wie ist das möglich und wie gehe ich damit um? Ich erstelle ein Backup-Skript, das von Unix abhängig ist dateund einen interessanten Fehler entdeckt hat:

[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
Drückeberger
quelle
Könnte es ein Schaltjahr / 29. Februar Bug sein? Unwahrscheinlich in einem Tool wie date...
Mark Henderson

Antworten:

44

Dieses Verhalten tritt aufgrund der Sommerzeit (Sommerzeit) auf.

Weil Sie sich gerade in der Sommerzeit befinden, in der Ihre Uhr eine Stunde voraus ist, wenn Sie vor drei Monaten um kurz nach Mitternacht am ersten Juni nachfragen, endet die Zeit eine Stunde "früher", weil es nicht Sommerzeit drei war vor wenigen Monaten.

In der GNU- Datumsdokumentation wird vorgeschlagen, dies zu umgehen, indem 12:00 Uhr und der 15. des Monats als Ausgangspunkt verwendet werden, wenn nach relativen Tagen bzw. Monaten gefragt wird. Beispielsweise:

date +%y-%m-%d --date="$(date +%Y-%m-15) -3 month"
Michael Hampton
quelle
Danke. Ja, genau "vor 3 Monaten" kommt um [root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago' 14-03-01 [root@web000c zfs_test]# date Sun Jun 1 01:00:15 CEST 2014
01:00
Doh! Ich denke, ich muss einige meiner Skripte durchgehen, da ich den Verdacht habe, dass ich diesen dateVerwendungsvorschlag übersehen habe .
Caleb
14

Wenn das absolute Timing Ihr Hauptanliegen ist, ist es wahrscheinlich am besten, UTC zu verwenden, da es für diesen Zweck vorhanden ist. Michaels Antwort ist sehr nützlich, wenn Sie innerhalb des Problems arbeiten müssen, aber es ist normalerweise eine gute Idee, es vollständig zu vermeiden, wo Sie können.

Wenn Ihr System standardmäßig nicht auf UTC eingestellt ist, können Sie die Zeitzone am einfachsten übergeben, indem Sie Ihrem Befehl die TZUmgebungsvariable voranstellen. Dies begrenzt den Zonenwechsel auf einen einzelnen Befehl und verhindert, dass die Variable in Ihre nachfolgenden Befehle gelangt.

$ 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

Sie sollten die TZVariable nicht exportieren , da dies die Problembehandlung sehr verwirrend machen kann, wie im Folgenden gezeigt wird.

$ 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
Andrew B
quelle
-3

In diesem bestimmten Jahr, in dem Ihr Computer denkt, dass er in Betrieb ist, und an dem bestimmten Datum, das Sie für einen Test ausgewählt haben (vor 1 Monat, vor 2 Monaten und vor 3 Monaten), ja, es handelt sich wahrscheinlich um eine Erkennung am 29. Februar. Nicht immer ein Fehler, aber ..

Heute ist NICHT der 01.06.2014. Versuch es noch einmal. Stellen Sie das Computerdatum auf 2013-06-01 ein. Versuch es noch einmal.
Stellen Sie das Computerdatum auf 2014-09-01 ein. Versuch es noch einmal.

user225906
quelle
6
Wenn Sie Daten im amerikanischen MDYFormat angeben, verwenden Sie bitte /es zum Trennen. Da wir hier eine internationale Gemeinschaft sind, ist es noch besser, geeignete ISO-Daten zu verwenden, z 2014-09-01.
Glglgl