phpbar.de logo

Mailinglisten-Archive

[php] Orstzeit (zum 2.)

[php] Orstzeit (zum 2.)

Tobias Ratschiller tobias_(at)_dnet.it
Thu, 12 Aug 1999 23:12:13 +0200


> Einziges Problem jetzt: wie kriege ich aus XX:YY GMT die jeweils
> richtige Darstellung für hier? Inkl. Sommerzeit etc.? Könnte
> natürlich eine feste Konstante einbauen (+2), diese dann mit
Einbruch
> der Winterzeit ändern, aber das geht vielleicht auch eleganter?

Eine kleine Geschichte über Zeitzonen. Ganz am Ende die praktische
Lösung für's Umrechnen, also bitte den Rest überspringen, falls zu
ausführlich. :-)

Musste ich Applikationen entwickeln, bei denen Zeitzonen wichtig
waren, wurde bislang der Benutzer aufgefordert, "seine" Zone aus einer
Liste auszuwählen.

Insgesamt gibt es auf einem RH6-System (bei Suse oder einer anderen
aktuellen Linux-Distro dürfte es nicht anders sein) 432 verschiedene
Zeitzonen in /usr/share/zoneinfo (das Arthur Olson Timezone System).
Da es wenig sinnvoll ist, den User vor die Aufgabe zu stellen, aus
über 400 Zonen seine herauszufinden, wird man versuchen, diese Liste
einzuschränken. Schaut man sich zwei Zeitpunkte innerhalb eines Jahres
an (einmal Winterzeit, z.b. Januar, einmal Sommerzeit, Juli), sieht
man, daß es 68 Zonen gibt, die effektiv verschiedene Zeiten haben.
Z.B. ist die Zone Asia/Kabul die einzige Zone in der Region GMT+4,
GMT+1 umfasst aber mehrere Zonen, (Europe/Berlin, Europe/Zurich,
usw.). Natürlich hat es einen Sinn, daß es 432 unterschiedliche Zonen
gibt und nicht nur 68: Man sollte also in der Applikation dem User auf
jeden Fall die Möglichkeit geben, alle 432 Zonen zu sehen.

Die 432 Zonen sowie die 68 "unique" Zonen findest Du in einem
gebrauchsfertigen Array unter
http://phpwizard.net/phpMisc/scripts/pretty/timezones.php3

In einer Applikation wird der Entwickler auswählen, welche Zonen
zuerst gezeigt werden sollen, auf Wunsch kann der Benutzer ein
erweitertes Menü einblenden. Die Arrays aus timezones.php3 sind Teil
des Backends und werden in der Regel dem Benutzer nicht gezeigt. Sie
sind aber zur Berechnung von Zeiten nützlich.

Die Umrechnung von einer Zeitzone zur anderen ist mit den
Timezone-Files aus /usr/share/zoneinfo zumindest unter Unix simpel:

Nehmen wir an, die Zeitzone des Benutzers ist "America/New_York". Das
Datum in der Datenbank ist in GMT gespeichert (12:00:30 GMT);
natürlich muss in der DB auch die Zeitzone des Benutzers gespeichert
sein.

Die aktuelle Zeitzone wird über die Umgebungsvariable "TZ" festgelegt.
PHP-Datums- und Zeit-Funktionen wie date() rechnen in dieser Zeitzone.
Tadaaa... das ist die Lösung: Man ändere einfach kurzfristig (und nur
für das aktuelle Script) die Zeitzone:

PutEnv("TZ=America/New_York");        // In die Zeitzone des Benutzers
wechseln
echo date("d.m.Y", $row["time_gmt"]); // Formatiertes Datum ausgeben
PutEnv("TZ=/etc/localtime");          // Lokale Zeitzone
wiederherstellen

(In der Praxis wird man in der ersten PutEnv-Anweisung die Zeitzone
aus der Datenbank beziehen. Beziehungsweise aus meinem Array; in der
DB würde dann nur der Schlüssel dazu abgespeichert, im Beispiel also
'A7'. Das PutEnv würde damit so aussehen:
PutEnv("TZ=".$timezonefiles[$row["time_zone"]]).

Mit freundlichen Grüßen,
  Tobias Ratschiller



php::bar PHP Wiki   -   Listenarchive