Mailinglisten-Archive |
> 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