Bash: Zeitvariable nach UTC wandeln

linuxnutzer

Captain
Registriert
Dez. 2011
Beiträge
3.328
Lokalzeit:
Code:
var='2026-01-01T0:04:05'

Code:
$ date -d $var +%FT%T
2026-01-01T00:04:05

mit -u ändert sich nichts.

Code:
$ date -u -d $var +%FT%T
2026-01-01T00:04:05

Mir welchem Befehl konverttiert man nach UTC und schreibt das Ergebnis wieder in eine Variable?

Wie lautet der Befehl in der anderen Richtung. Ausgang ist die UTC-Zeit in einer Variable und die soll in die Lokalzeit gewandelt werden.
 
Sicherheitshalber würde ich den vollen Format-String angeben. Außerdem sollte das Datum noch ein Verweis auf das Quellformat enthalten. Also CET für Central Europe Time bzw. UTC für halt UTC.

Wenn das Ziel UTC ist, kann man den Kommandozeilenschalter -u nehmen. Ansonsten wertet date auch die Umgebungsvariable TZ aus, womit man dann gezielt eine Zeitzone (Time Zone) auswählen kann

von lokal nach UTC:
date -u -d "$var CET" '+%Y-%m-%d %H:%M:%S'

von UTC nach lokal:
TZ="Europe/Berlin" date -d "$var UTC" '+%Y-%m-%d %H:%M:%S'

Wenn man sich unsicher ist, was date genau treibt, kann man testweise den Kommandozeilenschalter
--debug angeben, um Debug-Infos nach stderr schreiben zu lassen.

siehe auch:
https://www.man7.org/linux/man-pages/man1/date.1.html
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: nutrix, linuxnutzer, Enigma und 2 andere
Eingangszeitstempel ohne Angabe einer Zeitzone sind immer problematisch. Woher soll das Tool wissen, aus welcher Zeitzone es umrechnen soll?
Wenn ich dir dieses Datum gebe und sage: "Mach mal UTC draus", dürfte deine erste Frage sein: "Aus welcher Zeitzone kommt das Datum?" ;)

Alles Weitere siehe Post von @andy_m4
 
  • Gefällt mir
Reaktionen: linuxnutzer
Das hatte ich erst gestern in SAP. Wenn keine Zeitzone dran ist, geht man von UTC aus. Gängige Praxis in der API.
 
  • Gefällt mir
Reaktionen: linuxnutzer
KillerCow schrieb:
Woher soll das Tool wissen, aus welcher Zeitzone es umrechnen soll?

Es soll die Zeitzone der Systemzeit angenommen werden.

Wie kitzelt man das am besten raus, mit timedatectl?

Ist der ganze Befehl der Umwandlung in 1 Zeile zu schaffen, sodass letztlich alles als Variable definiert wird? Es ist nicht immer davon auszugehen, dass es CET ist.
 
linuxnutzer schrieb:
Es soll die Zeitzone der Systemzeit angenommen werden.

Wie kitzelt man das am besten raus
Manpage lesen! :-)
date '+%Z'

linuxnutzer schrieb:
Ist der ganze Befehl der Umwandlung in 1 Zeile zu schaffen, sodass letztlich alles als Variable definiert wird? Es ist nicht immer davon auszugehen, dass es CET ist.
Du meinst sowas wie:
date -u -d "$var $(date +%Z)" '+%Y-%m-%d %H:%M:%S'
?
 
  • Gefällt mir
Reaktionen: linuxnutzer
linuxnutzer schrieb:
Es soll die Zeitzone der Systemzeit angenommen werden.
Eigentlich gibt es unter Unix keine Zeitzone des Systems, höchstens ist das ein Default.

Jeder User, jeder Prozess kann sich in einer eigenen unterschiedlichen Zeitzone befinden.
 
  • Gefällt mir
Reaktionen: linuxnutzer
andy_m4 schrieb:
Du meinst sowas wie:
date -u -d "$var $(date +%Z)" '+%Y-%m-%d %H:%M:%S'
?

nur das passt noch nicht bei Sommerzeit.

Code:
var='2026-08-01T0:04:05'

Im August sind es 2 Stunden Differenz zu UTC.

Code:
date -u -d "$var $(date +%Z)" '+%Y-%m-%d %H:%M:%S'
2026-07-31 23:04:05
 
Ich weiß nicht, ob es einen Unterschied macht. Die info-Seite von date schreibt zu Umrechnungen von Zeitzonen folgendes:
To convert a date string from one time zone FROM to another TO,
specify ‘TZ="FROM"’ in the environment and ‘TZ="TO"’ in the
‘--date’ option. *Note Specifying time zone rules::. For example:

TZ="Asia/Tokyo" date --date='TZ="America/New_York" 2023-05-07 12:23'
Mon May 8 01:23:00 JST 2023

If you do not specify time zone information in the date string,
‘date’ uses your computer's idea of the time zone when interpreting
the string.
 
linuxnutzer schrieb:
nur das passt noch nicht bei Sommerzeit.
Tipp: Am besten soviel time_t (Anzahl Sekunden seit 1970) nutzen wie möglich und nur bei der Ausgabe konvertieren:
Code:
$ date +%s; sleep 3; date +%s
1768474747
1768474750
$ date --date='@1768474750'
Thu Jan 15 11:59:10 AM CET 2026
$
Schaltsekunden bleiben auch dann ein Thema.
 
  • Gefällt mir
Reaktionen: Enigma
foofoobar schrieb:
Schaltsekunden bleiben auch dann ein Thema.

Schaltjahre auch?

Code:
winter='2026-01-01T0:04:05'

Code:
sommer='2026-08-01T1:11:05'

BTW ich brauche eine ISO 8601 Ausgabe, also mit T als Trenner von Darum und Zeit.

Code:
+%FT%T

Bitte konkrete Syntax-Beispiele für Sommer und Winter, wobei die Sommerzeit automatisch erkannt wird.
 
  • Gefällt mir
Reaktionen: linuxnutzer
Ok, die Schaltsekunden sind vernachlässigbar.

Mir ist aber noch immer nicht klar wie ich das in 1 Zeile mit den Zeitzonen bekomme.

Gegeben ist eine Zeit, die ich mir aus einem Dateinamen hole, wobei es da unterschiedliche Muster gibt.. Es steht also dann die Zeit in einer Variable mit immer gleicher Formatierung zur Verfügung, zu der ich UTC brauche, nehmen wir mal an, dass es meistens CET als Ausgangsbasis ist.

Eigentlich ist 1h falsch nicht so tragisch, aber wenn ich zurück wandeln muss, soll sich der Fehler nicht vergrößern, also lieber gleich richtig.
 
Ich wollte jetzt nur sagen, dass es nicht um schwierige Zeitzonen mit 0,5h geht. "date +%Z" passt schon.

Code:
sommer='2026-08-01T1:11:05'

Eigentlich wäre die genannten Lösung schon passend, wenn da nicht der Fehler bei der Sommerzeit wäre.

Code:
sommer='2026-08-01T1:11:05'

Code:
$ date -u -d "$sommer $(date +%Z)" +%s
1785543065

aber

Code:
$ date -d "$sommer $(date +%Z)" +%s
date: ungültiges Datum »2026-08-01T1:11:05 CET“

Die Wandlung zu UTC passt ja nicht bei Sommerzeit, also möchte -u weglassen und das bringt den Fehler.

Der nächste Schritt wäre dann zu schauen, ob die Wandlung von Sekunden ausgehend zu +%FT%T passt.
 
Also weißt du nicht ob deine Zeitstempel Winter oder Sommerzeit sind?

Evtl. hilft das: zdump -v /usr/share/zoneinfo/CET
 
foofoobar schrieb:
Also weißt du nicht ob deine Zeitstempel Winter oder Sommerzeit sind?

Ich habe ein Datum und nicht mehr. Die Zeitzone ergibt sich wie diskutiert. Der Rest muss irgendwie errechnet werden. Die Sommerzeit / Winterumstellung ist ja immer am Wochenende und nicht immer zum gleichen Datum.

zdump -v /usr/share/zoneinfo/CET
Damit könnte man vielleicht was basteln.

Ist date wirklich nicht in der lage die DST automatisch zu erkennen? Wenn das zu umständlich wird, dann lasse ich es.
 
Wenn es Sommerzeit ist, ist das Zeitzonenkürzel CEST, nicht CET. Deswegen erhälst du die Fehlermeldung ungültiges Datum.
Ergänzung ()

linuxnutzer schrieb:
Die Wandlung zu UTC passt ja nicht bei Sommerzeit, also möchte -u weglassen und das bringt den Fehler.
Nochmal genauer: Das Problem hier ist, dass du einen Datumswert per Variable vorgibst, dir die Zeitzone aber nicht aus der Variable errechnen lässt, sondern dir stattdessen die aktuelle Zeitzone ausgeben lässt. Das kann nur zu Fehlern führen.
 
Zuletzt bearbeitet:
Evil E-Lex schrieb:
Das Problem hier ist, dass du einen Datumswert per Variable vorgibst, dir die Zeitzone aber nicht aus der Variable errechnen lässt, sondern dir stattdessen die aktuelle Zeitzone ausgeben lässt. Das kann nur zu Fehlern führen.

Ok, Ausgang ist aber die Variable. Gibt es eine andere Lösung die DST aus der Variablen zu berechnen? CET stimmt ja schon, geht ja nur mehr um Sommerzeit oder nicht. Es macht ja auch keinen Sinn die Sommerzeit zum Zeitpunkt des Befehls zu bestimmen.

timedatectl gibt ja auch den Ort der Zeitzone aus. Dann hat man einen Anhaltspunkt was das für eine Zeit ist. Über das Datum sollte man bestimmen können, ob Sommerzeit oder nicht.
 
Zurück
Oben