TZFILE(5) | Linux-Programmierhandbuch | TZFILE(5) |
tzfile - Zeitzonen-Informationen
Die von tzset(3) verwandten Zeitzoneninformationsdateien liegen typischerweise unterhalb eines Verzeichnisses mit einem Namen wie /usr/share/zoneinfo. Diese Dateien verwenden das im Internet-RFC 8536 beschriebene Format. Jede Datei ist eine Sequenz von 8-Bit-Bytes. In einer Datei wird eine binäre Ganzzahl durch eine Sequenz von einem oder mehreren Bytes in Netzwerkreihenfolge (bigendian oder hochgradiges Byte zuerst) dargestellt, wobei alle Bits signifikant sind; eine vorzeichenbehaftete binäre Ganzzahl wird mittels Zweierkomplement dargestellt und ein logischer Wert wird durch eine binäre Ganzzahl aus einem Byte, die entweder 0 (falsch) oder 1 (wahr) ist, dargestellt. Das Format beginnt mit einem 44-Byte-Vorspann, der die folgenden Felder enthält:
Der vorgenannte Vorspann wird von den folgenden Feldern, deren Länge abhängig von den Inhalten des Vorspanns ist, gefolgt:
struct ttinfo { int32_t tt_utoff; unsigned char tt_isdst; unsigned char tt_desigidx; };
Jede Struktur besteht aus einem vorzeichenbehafteten 4-Byte-Ganzzahlwert für tt_utoff, geschrieben in Netzwerk-Byte-Reihenfolge, gefolgt von dem logischen 1-Byte Wert für tt_isdst und einem 1-Byte-Wert für tt_desigidx. In jeder Struktur legt tt_utoff die Anzahl Sekunden fest, die zu UT addiert werden, tt_isdst bestimmt, ob tm_isdst von localtime(3) gesetzt werden soll und tt_desigidx dient als Index im Feld der Abkürzungsbytes für Zeitzonen, die den ttinfo-Strukturen in der Datei folgen. Der Wert tt_utoff ist niemals identisch zu -2**31, damit sich 32-Bit-Clients mit ihm ohne Überlauf aushandeln können. In realistischen Anwendungen ist tt_utoff im Bereich [-89999, 93599] (d.h. mehr als -25 Stunden und weniger als 25 Stunden); dies erlaubt leichte Unterstützung durch Implementierungen, die bereits den durch POSIX verlangten Bereich [-24:59:59, 25:59:59] unterstützen.
Die Standard/Wall- und UT/Local-Kennziffern wurden zur Umwandlung von Übergangszeiten einer TZif-Datei in geeignete Übergänge für andere Zeitzonen, die mittels einer POSIX-artigen TZ-Zeichenkette ohne Regeln festgelegt wurde, entwickelt. Ist beispielsweise TZ="EET-2EEST" und es gibt keine TZif-Datei "EET-2EEST", dann besteht die Idee darin, die Regeln aus einer TZif-Datei mit dem gut bekannten Namen »posixrules« anzupassen, die nur für diesen Zweck existiert und eine Kopie der Datei »Europe/Brussels«, einer Datei mit einem anderen UT-Versatz, ist. POSIX spezifiziert dieses veraltete Übergangsverhalten nicht, die Standardregeln hängen von der Installation ab und es gibt keine bekannte Implementierung, die diese Funktionalität für Zeitstempel nach 2037 implementiert. Um eine bessere historische Abdeckung zu erreichen, wird auf TZ="EET-2EEST,M3.5.0/3,M10.5.0/4" zurückgefallen, falls POSIX-Konformität benötigt wird und ältere Zeitstempel könnten nicht korrekt gehandhabt werden.
Die Funktion localtime(3) verwendet normalerweise den ersten ttinfo-Eintrag in der Datei, wenn entweder tzh_timecnt Null ist oder das Zeit-Argument kleiner ist als der erste in der Datei abgelegte Übergangszeitpunkt.
Diese Handbuchseite beschreibt <tzfile.h> aus dem Glibc-Quelltext (siehe timezone/tzfile.h).
Es scheint, dass timezone tzfile intern verwendet, aber Glibc das nicht in der Anwendungsebene verfügbar macht. Der Grund ist höchstwahrscheinlich, dass die standardisierten Funktionen sinnvoller, besser portierbar und tatsächlich von Glibc dokumentiert sind. Vermutlich ist es nur in Glibc enthalten, um die nicht von Glibc (sondern einer anderen Organisation) gepflegten Zeitzonendaten zu unterstützen.
Für Zeitzonen-Dateien im Version-2-Format folgen dem oben Beschriebenen (Vorspann und Daten) ein zweiter Vorspann und Daten in einem ähnlichen Format. Der Unterschied besteht darin, dass die Übergangszeiten und Schaltsekundenzeiten jeweils mit jeweils acht Byte kodiert werden (Schaltsekundenzahlen bleiben vier Bytes). Nach dem zweiten Vorspann und den Daten folgt eine durch Zeilenumbrüche eingeschlossene Zeichenkette im Stil von POSIX-Zeitzonen-Umgebungsvariablen. Sie ist für die Behandlung der Momente nach der letzten in der Datei gespeicherten Übergangszeit oder für alle Momente, falls die Datei keine Übergänge enthält, gedacht. Die POSIX-artige TZ-Zeichenkette ist leer (d.h. nichts zwischen den Zeilenumbrüchen), falls es keine POSIX-Darstellung für solche Momente gibt. Falls nicht leer, muss die POSIX-artige Zeichenkette mit dem lokalen Zeittyp nach der letzten Übergangszeit, falls diese in den Acht-Byte-Daten vorhanden ist, übereinstimmen. Falls die letzte Übergangszeit bei der beispielhaften Zeichenkette “WET0WEST,M3.5.0,M10.5.0/3” im Juli gewesen ist, dann muss der lokale Übergangszeittyp die Sommerzeit festlegen, die mit “WEST” d.h. eine Stunde östlich von UT, festgelegt wird. Falls es auch mindestens einen Übergang gibt, wird der Zeittyp 0 der Zeitperiode von der unendlichen Vergangenheit bis zu, aber nicht einschließlich der ersten Übergangszeit zugeordnet.
Für Zeitzonendateien im Version-3-Format darf die POSIX-TZ-artige Zeichenkette zwei kleinere Erweiterungen gegenüber dem POSIX-TZ-Format verwenden, wie diese in newtzset(3) beschrieben sind. Zuerst darf der Stundenanteil seiner Übergangszeiten vorzeichenbehaftet und im Bereich von -167 bis 167 sein, statt wie von POSIX verlangt vorzeichenlos im Bereich 0 bis 24. Zweitens ist die Sommerzeit das ganze Jahr über effektiv, falls sie am 1. Januar um 00:00 anfängt und am 31. Dezember um 24:00 endet, plus dem Unterschied zwischen der Sommerzeit und der Standardzeit.
In zukünftigen Änderungen des Formats können weitere Daten angehängt werden.
Version-1-Dateien werden als veraltetes Format betrachtet und sollten vermieden werden, da sie keine Übergangszeiten nach dem Jahr 2038 unterstützen. Leseprogramme, die nur Version 1 verstehen, müssen sämtliche Daten, die hinter dem berechneten Ende des Version-1-Datenblocks liegen, ignorieren.
Schreibprogramme sollten eine Version-3-Datei erstellen, falls die TZ-Zeichenkettenerweiterung notwendig ist, um genaue Übergangszeiten zu modellieren. Andernfalls sollten Version-2-Dateien erstellt werden.
Die Sequenz der durch den Version-1-Vorspann und -Datenblock definierten Zeitänderungen sollten eine aufeinanderfolgende Teilfolge von Zeitänderungen sein, die durch Version 2+-Vorspann und -Datenblock und dem Nachspann definiert werden. Diese Richtschnur hilft veralteten Version-1-Leseprogrammen, mit den aktuellen Leseprogrammen über Zeitstempel innerhalb der aufeinanderfolgenden Teilfolge übereinzustimmen. Es lässt Schreibprogrammen, die veraltete Leseprogramme nicht unterstützen, einen tzh_timecnt von Null in dem Version-1-Datenblock verwenden, um Platz zu sparen.
Zeitzonenbezeichnungen sollten aus mindestens drei (3) und nicht mehr als sechs (6) alphanumerischen ASCII-Zeichen bestehen “-”, und “+”. Dies ist zur Kompatibilität zu POSIX-Anforderungen für Zeitzonenabkürzungen.
Beim Lesen einer Version 2- oder -3-Datei sollten Leseprogramme den Version-1-Vorspann und -Datenblock ignorieren und ihn lediglich überspringen.
Leseprogramme sollten als Teil der Gültigkeitsprüfung für die Datei die Gesamtlänge der Vorspänne und Datenblöcke berechnen und prüfen, dass sie alle in die tatsächliche Dateigröße hineinpassen.
Dieser Abschnitt dokumentiert häufige Probleme beim Lesen oder Schreiben von TZif-Dateien. Die meisten Probleme bestehen beim Erstellen von TZif-Dateien für den Einsatz mit älteren Leseprogrammen. Die Ziele dieses Abschnittes sind:
Wenn neue Versionen des TZif-Formats definiert wurden, war ein Design-Ziel, dass das Leseprogramm eine TZif-Datei erfolgreich verwenden kann, selbst wenn die Datei für eine neuere TZif-Version ist, als für die das Leseprogramm entwickelt wurde. Wenn eine komplette Kompatibilität nicht erreicht wurde, wurde versucht, die Störungen auf selten benutzte Zeitstempel zu begrenzen und einfache teilweise Umgehungen in Schreibprogrammen, die für die Daten der neuen Version entwickelt wurden, selbst für Leseprogramme älterer Versionen zu erlauben.
Interoperabilitätsprobleme mit TZif sind beispielsweise:
Einige Interoperabilitätsprobleme sind Fehler von Leseprogrammen, die hier hauptsächlich als Warnung an Entwickler von Leseprogrammen aufgeführt sind.
time(2), localtime(3), tzset(3), tzselect(8), zdump(8), zic(8).
Olson A, Eggert P, Murchison K. The Time Zone Information Format (TZif). 2019 Feb. Internet RFC 8536 doi:10.17487/RFC8536.
Diese Seite ist Teil der Veröffentlichung 5.10 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer <Martin.E.Schauer@gmx.de>, Helge Kreutzmann <debian@helgefjell.de> und Mario Blättermann <mario.blaettermann@gmail.com> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer.
27. April 2020 |