Ich habe einen Server, dessen Zeitzone auf UTC
eingestellt ist . Es schien, als wäre das im Allgemeinen eine gute Praxis (bitte korrigieren Sie mich, wenn ich falsch liege).
Wie auch immer, einer der Server, zu denen ich mich verbinde, um scp
Dateien, läuft auf EDT
und speichert Dateien, die ich kopieren muss, im Format /path/to/filename/data20120913
Ich habe versucht, rsync
zu versuchen Dateien mit so etwas wie -mtime -1
von find Flag für Dateien, die am letzten Tag geändert wurden, aber ich hatte kein Glück.
Ich habe nichts dagegen, einfach scp
zu verwenden um die Datei des aktuellen Tages zu kopieren, aber im Moment gibt es ein 4-Stunden-Fenster, in dem date +%Y%m%d
ausgeführt wird wird auf jedem Server einen anderen Tag geben und das nervt mich ein wenig.
man date
durchsehen Ich sehe, dass ich die Uhrzeit als UTC
ausgeben lassen kann , aber ich sehe keine Möglichkeit, es als eine andere Zeitzone wie EDT
auszugeben
Ich nehme an, ich könnte auch so etwas wie GNU
verwenden Datumserweiterung date -d 20100909 +%s
Um das Datum in Sekunden aus der Epoche zu erhalten, wenden Sie einen manuellen 4 * 60 * 60
an zweite Berechnung, und versuchen Sie, das als Datum darzustellen – aber wenn die Sommerzeit beginnt, ist es immer noch eine Stunde daneben.
Gibt es eine einfachere Möglichkeit, das Datum in einem YYYYMMDD
auszugeben? Format für EDT
auf einem Server, der auf UTC
eingestellt ist ?
Akzeptierte Antwort:
Sie können eine Zeitzone für die Dauer der Abfrage festlegen, also:
TZ=America/New_York date
Beachten Sie den Leerraum zwischen TZ
Einstellung und das date
Befehl. In Bourne-ähnlichem und rc
-ähnliche Shell, die den TZ
setzt Variable nur für die Kommandozeile. In anderen Shells (csh
, tcsh
, fish
), können Sie immer die env
verwenden Befehl stattdessen:
env TZ=America/New_York date
tl;dr
Auf Linux-Systemen. Zeitzonen werden in Dateien in /usr/share/zoneinfo
definiert Verzeichnis. Diese Struktur wird oft als „Olson-Datenbank“ bezeichnet, um ihren Gründungsmitglied zu ehren.
Die Regeln für jede Zeitzone werden als Textdateizeilen definiert, die dann in eine Binärdatei kompiliert werden. Die so kompilierten Zeilen definieren den Zonennamen; ein Daten- und Zeitbereich, in dem die Zone gilt; ein Offset von UTC für die Standardzeit; und die Notation zum Definieren, wie der Übergang zur und von der Sommerzeit erfolgt, falls zutreffend.
Beispielsweise enthält das Verzeichnis „Amerika“ die erforderlichen Informationen für New York in der Datei America/New_York
wie oben verwendet.
Beachten Sie, dass die Angabe einer nicht vorhandenen Zone (Dateiname) stillschweigend ignoriert und UTC-Zeiten gemeldet werden. Beispielsweise wird hier eine falsche Zeit gemeldet:
TZ="America/New York" date ### WRONG ###
Die Single UNIX Specification, Version-3, bekannt als SUSv3 oder POSIX-2001, weist darauf hin, dass aus Gründen der Portabilität die Zeichenfolge, die die Zeitzonenbeschreibung identifiziert, mit einem Doppelpunkt beginnen sollte. Daher können wir auch schreiben:
TZ=":America/New_York" date
TZ=":America/Los_Angeles" date
Als alternative Methode zur Angabe von Zeitzonen über einen Pfadnamen zu einer Beschreibungsdatei beschreibt SUSv3 das POSIX-Modell. In diesem Format ist eine Zeichenfolge definiert als:
std offset [dst[offset][,start-date[/time],end-date[/time]]]
wobei std
ist der Standardkomponentenname und dst
ist die Sommerzeit. Jeder Name besteht aus drei oder mehr Zeichen. Der offset
ist positiv für Zeitzonen westlich des Nullmeridians und negativ für Zeitzonen östlich des Meridians. Der Offset wird zur Ortszeit addiert, um UTC (früher bekannt als GMT) zu erhalten. Der start
und end
Zeitfelder geben an, wann die Standard-/Tageslicht-Übergänge stattfinden.
Im Osten der Vereinigten Staaten ist die Standardzeit beispielsweise 5 Stunden früher als UTC, und wir können EST5EDT
angeben anstelle von America/New_York
. Diese Alternativen werden jedoch nicht immer erkannt, insbesondere für Zonen außerhalb der Vereinigten Staaten, und sollten am besten vermieden werden.
HP-UX (ein SUSv3-kompatibles UNIX) verwendet Textregeln in /usr/lib/tztab
und die POSIX-Namen wie EST5EDT, CST6CDT, MST7MDT, PST8PDT. Die Datei enthält alle historischen Regeln für jede Zeitzone, ähnlich der Olson-Datenbank.
HINWEIS: Sie sollten in der Lage sein, alle Zeitzonen zu finden, indem Sie das folgende Verzeichnis untersuchen:/usr/share/zoneinfo
.