Ich habe einen Server mit der eingestellten Zeitzone UTC
. Es schien, als wäre das im Allgemeinen eine gute Übung (bitte korrigieren Sie mich, wenn ich falsch liege).
Auf jeden Fall scp
läuft einer der Server, mit denen ich eine Verbindung herstelle, um Dateien zu erstellen, EDT
und speichert Dateien, die ich kopieren muss, im Format/path/to/filename/data20120913
Ich habe versucht, rsync
Dateien mit so etwas wie find's -mtime -1
flag für Dateien zu bearbeiten, die am letzten Tag geändert wurden, aber ich hatte kein Glück.
Es macht mir nichts aus, nur scp
die Datei des aktuellen Tages zu kopieren, aber derzeit gibt es ein 4-Stunden-Fenster, in dem die Ausführung date +%Y%m%d
auf jedem Server einen anderen Tag anzeigt, was mich ein wenig stört.
Wenn man date
ich durchschaue, sehe ich, dass ich die Zeit als ausgeben lassen kann UTC
, aber ich sehe keine Möglichkeit, sie als eine andere Zeitzone auszugebenEDT
Ich nehme an, ich könnte auch so etwas wie die GNU
Datumserweiterung verwenden date -d 20100909 +%s
, um das Datum in Sekunden aus der Epoche abzurufen, eine manuelle Sekundenberechnung anzuwenden 4 * 60 * 60
und das Datum als Datum zu rendern - aber dann, wenn die Sommerzeit einsetzt, ist es noch eine Stunde frei .
Gibt es eine einfachere Möglichkeit, das Datum in einem YYYYMMDD
Format für EDT
einen Server auszugeben, der auf festgelegt ist UTC
?
Antworten:
Sie können eine Zeitzone für die Dauer der Abfrage festlegen.
Beachten Sie das Leerzeichen zwischen der
TZ
Einstellung und demdate
Befehl. In einer Bourne-ähnlichen und einerrc
ähnlichen Shell wird dieTZ
Variable nur für die Befehlszeile festgelegt. In anderen Schalen (csh
,tcsh
,fish
), können Sie immer die Verwendungenv
Befehl statt:tl; dr
Auf Linux-Systemen. Zeitzonen werden in Dateien im
/usr/share/zoneinfo
Verzeichnis definiert. Diese Struktur wird oft als "Olson-Datenbank" bezeichnet, um den Gründungsbeitrag zu ehren.Die Regeln für jede Zeitzone sind als Textdateizeilen definiert, die dann in eine Binärdatei kompiliert werden. Die so kompilierten Zeilen definieren den Zonennamen. einen Daten- und Zeitbereich, für den die Zone gilt; ein Versatz von UTC für die Standardzeit; und die Notation zum Definieren, wie der Übergang von und zur Sommerzeit erfolgt, falls zutreffend.
Beispielsweise enthält das Verzeichnis "Amerika" die erforderlichen Informationen für New York in der oben verwendeten Datei
America/New_York
.Beachten Sie, dass die Angabe einer nicht vorhandenen Zone (Dateiname) unbemerkt ignoriert und UTC-Zeiten gemeldet werden. Beispielsweise meldet dies eine falsche Zeit:
In der Single UNIX-Spezifikation, Version 3, bekannt als SUSv3 oder POSIX-2001, wird darauf hingewiesen, dass aus Gründen der Portabilität die Zeichenfolge, die die Beschreibung der Zeitzone angibt, mit einem Doppelpunkt beginnen sollte. So können wir auch schreiben:
Als alternative Methode zur Angabe von Zeitzonen unter Verwendung eines Pfadnamens zu einer Beschreibungsdatei beschreibt SUSv3 das POSIX-Modell. In diesem Format ist eine Zeichenfolge wie folgt definiert:
Wo
std
ist der Name der Standardkomponente und wodst
ist die Sommerzeit? Jeder Name besteht aus drei oder mehr Zeichen. Dasoffset
ist positiv für Zeitzonen westlich des Nullmeridians und negativ für jene östlich des Nullmeridians. Der Offset wird zur Ortszeit addiert, um die UTC (früher als GMT bekannt) zu erhalten. Die Felderstart
undend
Zeit geben an, wann die Standard- / Tageslichtübergänge auftreten.In den östlichen USA liegt die Standardzeit beispielsweise 5 Stunden vor UTC, und wir können
EST5EDT
anstelle von angebenAmerica/New_York
. Diese Alternativen werden jedoch insbesondere für Gebiete außerhalb der USA nicht immer anerkannt und sollten 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 der Zeitzonen zu finden , indem Sie das folgende Verzeichnis Inspektion:
/usr/share/zoneinfo
.quelle
export
sieht besser aus alsenv
BefehlSie können dies tun, indem Sie die
TZ
Umgebungsvariable bearbeiten. Im Folgenden finden Sie die Ortszeit für US / Eastern, die auch für die Sommerzeit geeignet ist:Der Zonenname stammt aus den darin enthaltenen Dateien und Verzeichnissen
/usr/share/zoneinfo
.quelle
Achtung! Das Datum gibt die Zeit in Ihrer CURRENT-Zeitzone aus. Wenn Sie eine Zeitzone angeben, wird diese nicht erkannt.
Überprüfen Sie dies heraus:
Beachten Sie, dass es keine Zeitzone namens EDT gibt. In der Tat,
kehrt zurück
Und das funktioniert:
Wenn Ihr Freund jedoch im mystischen Land Gobbledygook lebt und seine Zoneninformationen mit Ihren eigenen übereinstimmen, können Sie die Uhrzeit in der Zone von Gobbledygook als Datum ausgeben lassen Zone ist ihm nicht bekannt:
quelle
TZ
String die UTC-Zeit zurück.quelle
Der Zeitpunkt Syntax ist obskur und fehleranfällig, was ein Schmerz Kommandozeilenaufruf macht. Ich habe daher ein kleines Skript geschrieben (ich habe es Weltzeit genannt ), das die angegebene (oder aktuelle) Zeit ausgehend von der Basiszeit (Ihrer lokalen) in einigen anderen Zeitzonen und umgekehrt ausgibt.
Hier ist es. Passen Sie es an Ihre Bedürfnisse an, fügen Sie es in Ihren Pfad ein und machen Sie es ausführbar.
quelle
Oft haben Sie einen Zeitstempel in der lokalen Zeitzone und müssen ihn in Remote-TZ konvertieren. Es kann gemacht werden mit:
wo:
quelle