
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 date
Befehl 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 date
und untersucht info date
. Letzteres enthält weitere Informationen darüber, wie Zeichenfolgen wie 2019-10-19 01:37:02 +7 days
interpretiert werden.
Vorbemerkungen:
- Meine Antwort verwendet
date
, weil dies das Tool in Debian ist. (Verwende es,alias date=gdate
um meine Befehle zu testen,gdate
ohne 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, +7
dass Ihr „falsch verhaltender“ Befehl als UTC+7
und days
als 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+4
bedeutetUTC-04:00while UTC+7
in 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 days
wie 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 days
Teilstring an den Anfang, so dass er vor erscheint 01:37:02
. Dieser Weg +7
wird 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:02
wird die Eingabezeichenfolge gemäß der Zeitzone interpretiert, die date
fü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 date
sollten 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.