Im deutschen Sprachraum gibt es nur eine Zeitzone, deswegen sind Zeitangaben auf deutschen Websites eine eindeutige Angelegenheit: alles bezieht sich auf die Mitteleuropäische (Sommer-)Zeit. Englischsprachige Websites sind da schon viel problematischer. Allein die USA haben vier Hauptzeitzonen, dazu kommen Alaska und Hawai. Websites von amerikanischen Fernsehsendern bieten einen Zeitzonenselektor an.
Für eine internationale Website könnte ein brauchbare Zeitzonenselektor in etwa so aussehen:
All times are GMT. Change Timezone
Geht das für den Nutzer auch bequemer? Weltweit gibt es schließlich 40 Zeitzonen, die zur Auswahl gestellt werden müssen, unter anderem Exoten wie GMT+8:45 in einer westaustralischen Region mit gerade mal 200 Einwohnern. Dazu kommt die unübersichtliche regionale und von Jahr zu Jahr wechselnde Handhabung von Sommerzeit, mit teilweise dramatischen Konsequenzen, wie etwa in Israel:
In territories controlled by the Palestinian National Authority, daylight saving time [Sommerzeit] ends later, which can lead to some confusion. On September 5, 1999, terrorists were transporting a bomb that they mistakenly thought was set to go off at 17:30 Israel Standard Time; it was actually set for 17:30 Palestinian Daylight Time, which was an hour ahead. As a result, the bomb went off while the bomb was still being transported, killing the terrorists. (Wikipedia)
Zurück zur virtuellen Welt: Leider schickt der Internet-Browser nicht die auf dem Client eingestellte Zeitzone zum Webserver, so wie das bei der Sprache passiert. Der Webserver kann automatisch die richtige Sprache auswählen, aber nicht die richtige Zeitzone (es sei denn, er versucht eine geographische Auswertung der IP-Addresse, was aufwändig und unzuverlässig ist).
Interessanterweise ist es aber in Javascript möglich, die Zeitzone herauszufinden, also nachdem die Seite vom Server auf den Client übertragen wurde:
new Date().getTimezoneOffset()
gibt -120 zurück, also die Zeitverschiebung zu GMT in Minuten. Eine naheliegende Strategie ist daher folgende:
Ein Javascript speichert die Zeitzone in einem Cookie, welches der Server ausliest, um die Zeitzonen-Transformation serverseitig durchzuführen.
Diese Strategie leidet offensichtlich unter einem Henne-Ei-Problem: Das Cookie kann erst erzeugt werden, wenn die erste Seite bereits geladen ist, so daß Zeitangaben dieser ersten Seite nicht transformiert werden können.
Gravierender ist aber die fehlende Berücksichtigung der Sommerzeitumstellung. Enthält die Seite eine zukünftige Zeitangabe, und zwischen der Auslieferung der Seite und dem angegebenen Zeitpunkt liegt eine Umstellung auf Sommerzeit (oder zurück), wird sie falsch dargestellt. Der Zeitpunkt der Sommerzeitumstellung kann in Javascript nicht explizit abgefragt werden.
Vorzuziehen ist daher die clientseitige Transformation:
Der Server liefert die Zeit unabhängig von der Zeitzone aus (zum Beispiel immer in GMT), und ein Javascript wandelt diese nach dem Laden der Seite in Zeitangaben in der lokalen Zeitzone um.
Dazu kann die Zeitangabe in HTML mit zusätzlichem Markup* versehen werden:
<object class="timestamp"> 09.07.2009 15:03 <param name="time" value="2009-07-09T15:03:17+02:00"/> <object>
Nach dem Laden der Seite durchläuft ein Javascript dann sämtliche markierte Zeitangaben, wertet den zusätzlichen Parameter mit maschinenfreundlicher Zeitangabe im ISO-Format aus, und ersetzt dann den vorgegebenen Text durch die in der lokalen Zeitzone berechneten, menschenfreundliche Zeitangabe. Realisiert mit dem populären Javascript-Toolkit Dojo könnte das so aussehen:
dojo.query("object.timestamp").forEach( function(node) {
var isoTime = dojo.query("param[name='time']", node)[0]
.getAttribute("value");
var machineTime = dojo.date.stamp.fromISOString(isoTime);
var humanTime = dojo.date.locale.format(time);
node.innerHTML = humanTime;
});
Hier sorgt die Javascript-Datumsbehandlung dafür, daß auch die Sommerzeitumstellung korrekt berücksichtig wird.
*) Mögliche Markup-Alternativen zum <object/>-Tag werden in "A Survey of HTML Annotation Methods" diskutiert. Erst in HTML 5 gibt es eine standardisierten Weg, Daten in HTML einzubinden: "HTML 5 data- Attributes".