Das Auslesen der Systemuhr eines Servers ist für erfahrene Entwickler kein Problem. Die Weiterverarbeitung der gewonnen Information, insbesondere bei Zeitzonenverschiebung, gestaltet sich dagegen aufwändiger. ZDNet zeigt einfache und effektive Möglichkeiten.
PHP[1] stellt dem Entwickler einen umfangreichen Katalog an Datums- und Zeitfunktionen zur Verfügung. Sie erlauben es, Daten und Uhrzeiten abzurufen und in ein gewünschtes Format zu bringen. Entweder als Grundlage für weiterer Berechnungen oder um sie dem Nutzer einer Anwendung anzuzeigen. Sobald man sich allerdings an etwas schwierigere Aufgaben macht, wird es schnell sehr kompliziert.
Ein Beispiel dafür ist etwa das Vorhaben, die aktuelle Zeit auf einer Webseite darzustellen. Bei PHP kann man ohne weiteres die date()-Funktion nutzen, um die Systemuhr des Servers auszulesen und die Information im gewünschten Format anzuzeigen. Aber was geschieht, wenn die aktuelle Zeit an einem anderen Ort angezeigt werden soll - wenn beispielsweise ein Unternehmen in einem anderen Land sitzt als sein Server, aber die Mitarbeiter ihre Ortszeit und nicht die lokale Zeit des Servers sehen sollen?
In diesem Fall müsste der Zeitunterschied zwischen beiden Orten berechnet und bei der Ausgabe der Zeitinformationen berücksichtigt werden. Wenn der Zeitunterschied sehr groß ist, stellt sich darüber hinaus die Frage, ob die neu berechnete Zeit möglicherweise einen Tag vor oder einen Tag zurück liegt, ob eine Sommerzeit berücksichtigt werden muss, ob ein neuer Monat angefangen hat und wann Schaltjahre einzuberechnen sind.
Dass solche Zeitzonenkonvertierungen schnell sehr kompliziert werden können, wenn sie manuell erledigt werden, liegt auf der Hand. Zwar bietet PHP einige Zeitzonenfunktionen an, die bei der Lösung dieser Aufgaben helfen können. Sie sind allerdings nicht sehr intuitiv und bedürfen einiger Einarbeitung. Viel schneller geht die Sache mit der Pear[2]-Klasse Date von der Hand, die eine eingebaute Zeitzonenunterstützung hat. Sie stellt die einfachste Möglichkeit dar, solche Konvertierungen vorzunehmen.
Die folgende Anleitung zeigt, wie sich Zeitwerte zwischen unterschiedlichen Zeitzonen mithilfe der Pear-Klasse Date konvertieren lassen. Voraussetzung ist, dass funktionsfähige Apache- und PHP-Installationen vorhanden sind und dass die Pear-Klasse Date korrekt installiert wurde.
Hinweis: Das Pear-Paket Date kann direkt aus dem Internet installiert werden, indem man die benötigten Installationsdateien herunterlädt[3] oder die bereitgestellten Anweisungen[4] befolgt.
Das ist recht einfach. Den Klassen-Code einfügen, ein Date()-Objekt mit einem Datums/Zeit-String initialisieren und dann mithilfe der Methode getDate() den eben eingefügten Wert anzeigen lassen. So sieht das Ergebnis aus:
2006-06-21 15:45:27
Aber wenn das Datum nun ein anderes Format haben soll? Geht es um ein Standardformat wie ISO, genügt es, der Methode getDate() einen Modifikator mit folgenden Angaben zu übergeben:
Die Ausgabe entspricht in diesem Fall dem ISO-Standard-Format.
20060621T154527Z
Ist ein benutzerdefiniertes Format gewünscht, kann das mit der Methode format() erreicht werden. Wie die native date()-Funktion von PHP, unterstützt diese Methode eine Reihe von Formatspezifikatoren, mit denen die einzelnen Elemente der Datumsausgabe formatiert werden können. Im Folgenden ein Beispiel (die Dokumentation zur Klasse enthält eine vollständige Liste aller Modifikatoren):
Und so sieht das Ergebnis aus:
Wednesday, 21 June 2006 15:45:27
Nach der Einführung in die Grundlagen geht es jetzt um das Arbeiten mit unterschiedlichen Zeitzonen. Nachdem ein Date()-Objekt initialisiert wurde, geschieht die Konvertierung von einer Zeitzone in eine andere in zwei Schritten:
- Zunächst muss man der Date-Klasse mitteilen, aus welcher Zeitzone konvertiert werden soll. Dies geschieht mithilfe der Methode setTZByID().
- Dann sagt man der Date-Klasse, in welche Zeitzone konvertiert werden soll. Dies geschieht über die Methode convertTZByID().
In diesem Fall soll eine Zeit von der Mittleren-Greenwich-Zeit (GMT) in die Indische Standardzeit (IST) konvertiert werden. Indien ist der GMT 5,5 Stunden voraus. Daher gibt das Skript folgendes Ergebnis aus:
Wednesday, 21 June 2006 16:06:27
Die Konvertierung ist also denkbar einfach. Hier ist ein weiteres Beispiel, das zeigt, wie die Klasse Schaltjahre und Monatsenden behandelt.
Und das Ergebnis ist:
Local time is Saturday, 01 March 2008 06:36:27 Destination time is Friday, 29 February 2008 22:36:27
Hinweis: Wer mehr zu den Zeitzonen-IDs erfahren möchte, findet die vollständige Liste in der Klassen-Dokumentation. Eine andere Information, die bei der Arbeit mit unterschiedlichen Zeitzonen sehr nützlich sein kann, ist der Abstand einer bestimmten Zeitzone zur Standard-GMT. Mithilfe der Pear-Klasse Date kann diese Information sehr einfach ermittelt werden, und zwar über die Methode getRawOffset(). Hier ein Beispiel:
Hier berechnet die Methode getRawOffset() den Zeitunterschied zwischen einer lokalen Zeit und GMT. So sieht das Ergebnis aus:
-28800000
Zu beachten ist, dass das Ergebnis in Millisekunden ausgedrückt wird. Um den Wert in Stunden auszugeben, muss er also noch durch 3.600.000 geteilt werden (der Anzahl von Millisekunden in einer Stunde).
Tipp: Mithilfe der Methode inDaylightTime() lässt sich ermitteln, ob in der Zielzeitzone derzeit Sommerzeit herrscht. Einzelheiten zu dieser Methode kann man in der Klassendokumentation nachlesen. Mithilfe der Klasse Date können auch aufwendige Berechnungen an Datums- und Zeitwerten durchgeführt werden. So lässt sich zu einem Datums- oder Zeitwert eine bestimmte Dauer addieren oder von ihm subtrahieren. Solche Zeitspannen werden als String ausgegeben, der die Angaben Tage, Stunden, Minuten und/oder Sekunden enthält.
In dem Beispiel wird zu der ursprünglichen Zeitangabe eine Dauer von einer Stunde und 20 Minuten hinzugerechnet. Dazu wird die Methode addSpan() der Klasse Date aufgerufen und mit einem Date_Span()-Objekt versehen, in dem diese Zeitspanne angegeben wird. Das Ergebnis ist leicht zu erraten:
Wednesday, 21 June 2006 17:05:27
Natürlich lassen sich Zeitspannen genauso einfach subtrahieren wie addieren. Dazu dient die Methode subtractSpan().
Im Beispiel werden zunächst eine Stunde und 20 Minuten addiert, dann aber wieder fünf Minuten subtrahiert. Letztlich werden also eine Stunde und 15 Minuten hinzugefügt, was in der Ausgabe folgendermaßen aussieht:
Wednesday, 21 June 2006 17:00:27
Wie die aufgeführten Beispiele zeigen, bietet die Pear-Klasse Date Methoden, mit deren Hilfe sich relativ komplexe Datums- und Zeitberechnungen intuitiv und effizient durchführen lassen. Wer ohne all zu große Mühen die Zeitangaben verschiedener Orte konvertieren will, dem sei dieses Verfahren wärmstens empfohlen.
URLs in diesem Artikel:
[1] = http:/
[2] = http:/
[3] = http:/
[4] = http:/