Datumsmathematik liefert nicht das erwartete Ergebnis

Datumsmathematik liefert nicht das erwartete Ergebnis

Ich habe mehrere Beispiele gesehen (einschließlich diesesPost) und es scheint einfach genug, aber ich verstehe nicht ganz, was ich falsch mache (ich weiß, dass der Beitrag für Linux ist, aber ich habe es mit dem dateBefehl auf einer Linux-Maschine versucht und dort das gleiche Ergebnis erhalten)

Ein Beispielbefehl und eine Beispielausgabe

me@mymachine~$ gdate -d '2019-10-19 01:37:02 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 14:37:02

Ich hätte erwartet, dass das Ergebnis mit beginnt 2019-10-26. Es scheint also, dass meine Eingabe nicht analysiert wird, richtig?

Noch seltsamer (für mich jedenfalls) ist, dass es wie erwartet funktioniert, wenn ich den Zeitanteil der Eingabe entferne.

me@mymachine~$ gdate -d '2019-10-19 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-26 00:00:00

Antwort1

Analyse

Ich habe einige Tests in Debian 9 durchgeführt, man 1 dateund untersucht info date. Letzteres enthält weitere Informationen darüber, wie Zeichenfolgen wie 2019-10-19 01:37:02 +7 daysinterpretiert werden.

Vorbemerkungen:

  • Meine Antwort verwendet date, weil dies das Tool in Debian ist. (Verwende es, alias date=gdateum meine Befehle zu testen, gdateohne sie jedes Mal zu bearbeiten).
  • Es scheint, dass Ihre Zeitzone ungefähr entspricht TZ=UTC+4.

Ich habe versucht, Ihr Ergebnis zu reproduzieren:

$ date -d '2019-10-19 01:37:02 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 20:37:02

Mein Ergebnis ist anders, das zeigt, dass Zeitzonen eine Rolle spielen. So reproduzieren Sie Ihr Ergebnis wirklich:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 14:37:02

Erläuterung

Es stellt sich heraus, +7dass Ihr „falsch verhaltender“ Befehl als UTC+7und daysals interpretiert wird +1 days. Vergleichen Sie:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 UTC+7 +1 days' +"%Y-%m-%d %H:%M:%S"
2019-10-19 14:37:02

(Hinweis TZ=UTC+4bedeutetUTC-04:00while UTC+7in der Zeichenfolge bedeutetUTC+07:00. Die Inkonsistenz mit Zeichen wird erklärtHier.)

Das mysteriöse Ergebnis ist jetzt nicht mehr so ​​mysteriös.


Marotte

Was wirklich seltsam ist, ist Folgendes:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 UTC+7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-25 21:37:02

Offensichtlich heißt es nicht UTC+7„und“ days(Bedeutung +1 dayswie oben), sondern „und“ UTC(Bedeutung UTC+0) +7 days:

$ TZ=UTC+4 date -d '2019-10-19 01:37:02 UTC+0 +7 days' +"%Y-%m-%d %H:%M:%S"
2019-10-25 21:37:02

Lösung

Verschiebt den +7 daysTeilstring an den Anfang, so dass er vor erscheint 01:37:02. Dieser Weg +7wird nicht als interpretiert UTC+7:

$ date -d '2019-10-19 +7 days 01:37:02' +"%Y-%m-%d %H:%M:%S"
2019-10-26 01:37:02

Jetzt 01:37:02wird die Eingabezeichenfolge gemäß der Zeitzone interpretiert, die datefür richtig erachtet wird. Das Ergebnis* sollte für mich in Europa und für andere Benutzer in Amerika, Australien und überall gleich sein. Aus diesem Grund habe ich entfernt TZ=UTC+4, es spielt keine Rolle mehr.

*Ich meine dieZeichenfolgeDie von ausgegebenen Werte datesollten gleich sein. Verschiedene Benutzer interpretieren dieselbe Zeichenfolge in unterschiedlichen Zeitzonen und erhalten in der Realität unterschiedliche Zeitpunkte. In diesem Sinne sind ihre Ergebnisse unterschiedlich. Im gleichen Sinne sind ihre Eingaben unterschiedlich.

verwandte Informationen