Weltzeit Uhr

United States Großbritanien Frankreich Ukraine Madagaskar China Australien Neuseeland
Deutschland (Berlin) UTC+1/MESZ Deutschland
Großbritanien

Eine Uhr mit verschiedenen Zeitzonen

Hier möchte ich euch eine Uhr vorstellen, die die Zeit mit verschiedenen Zeitzonen anzeigt.

Im zweiten Schritt, möchte ich euch diese hier als analoge Version vorstellen.

Wie Ihr sicherlich wisst ist die Zeit in anderen Ländern eine andere als in Deutschland. Wenn man mit jemandem aus Australien telefonieren möchte, dann sollte man sich vorher erkundigen wie spät es dort ist.

Mit dieser Uhr könnt ihr genau das tun und die Zeiten in anderen Ländern ablesen. Wie genau das programmiert wird, erkläre ich euch jetzt.

Ziel ist es also eine Uhr zu erstellen die die lokale Uhrzeit (Deutschland) und die Uhrzeit eines anderen Landes anzeigt. Das andere Land kann durch klicken auf eine Flagge geändert werden. Die Vergleichsuhrzeit soll ich dadurch ändern.

Bilder: https://www.welt-flaggen.de/herunterladen/symbole#google_vignette

Update: Lange Zeit stand hier, dass die Uhrzeit von Großbritannien nicht stimmt, weil zur Sommerzeit die Uhrzeit nur eine Stunde Unterschied hat, zur Winterzeit aber 2h, und dass ich das noch reparieren müsste. Das habe ich jetzt getan. Der Grund für den Fehler und wie ich ihn behoben habe, steht weiter unten im Text bei der Erklärung des Codes.
Viel Spaß!

Der Quellcode

Ich möchte euch hier erklären wie ich die Weltzeituhr programmiert habe. Zuerst habe ich eine Tabelle erstellt:

Diese ist erst einmal statisch. Das heißt die Uhrzeit ändert sich nicht. Die Tabelle stellt unser Grundgerüst dar und wird nun nach und nach erweitert.
Die Tabelle enthält oben die Länder die man später auswählen kann.
Danach erfolgt eine Überschrift und die Daten von Deutschland und dem ausgewähltem Land.

Als nächsten Schritt wollen wir erst einmal die aktuelle Zeit in Deutschland anzeigen.
Hierfür nehmen wir den Code von Einfache digitale Uhr.
Wir nutzen die Javascript Funktion und kopieren das HTML in unsere Uhrzeit Tabelle für Deutschland:

Jetzt benötigen wir eine Javascript Funktion die die aktuelle Uhrzeit "umrechnet" und uns die Uhrzeit in, zum Beispiel, Großbritanien anzeigt.
Hierfür müsst ihr allerdings wissen, dass die "Deutsche Zeit" nicht die "Normale" Zeit ist. Die Welt unterteilt sich in verschiedene Zeitzonen.
Die UTC Zeit ist dabei die "Koordinierte Weltzeit" und ist der Startpunkt unserer Berechnungen.
Addiert man eine Stunde zur UTC Zeit hinzu erhält man die "Deutsche Zeit", oder auch Mitteleuropäische Zeit (MEZ).
In der Sommerzeit muss man 2 Stunden hinzu addieren. Für dieses einfache Einstiegsbeispiel lassen wir die Sommerzeit noch außer Acht, damit wir uns zuerst auf die Grundidee (UTC + fester Offset) konzentrieren können.
Weiter unten, wenn wir die einzelnen Länder als Objekte abbilden, lösen wir das Sommerzeit-Problem dann richtig.

In folgendem CodePen zeige ich euch nur die Methode um aus der UTC Zeit die britische Zeit anzuzeigen. Gerne könnt Ihr euch dort ausprobieren und eine andere Zeit berechnen.
Zum Beispiel die von New York?:

Ich hoffe dies verdeutlicht ein wenig die Umrechnung und wie diese funktioniert. Im CodePen habe ich die umgerechnete Zeit, den Versatz (also Offset), die UTC Zeit und die aktuelle regionale Zeit angezeigt.
Wenn ihr den Methodenaufruf ganz unten im Javascript ändert, dann ergibt sich auch eine andere "umgerechnete Zeit":

JavaScript
// Aufrufen der Methode
    SetTime_ByOffset_Min(120);

Ändert dies zu

JavaScript

    // Aufrufen der Methode
    SetTime_ByOffset_Min(-300);

Dadurch ändert sich die umgerechnete Zeit. Die UTC Zeit und die aktuelle Zeit bleiben unverändert.

Nun können wir bereits die aktuelle Uhrzeit anzeigen und die Uhrzeit anhand eines Versatzes neu berechnen. Überhnehmen wir die Funktionen in unsere Tabelle:

Hierfür habe ich die "offset_min" als globale Variable definiert, damit ist diese leichter für uns zu ändern.
Am Ende der Methode "SetTime_ByOffset_Min()" habe ich noch "SetTimeout(SetTime_ByOffset_Min,1000)" hinzugefügt, damit die Methode jede Sekunde aufgerufen wird und sich die Zeit auch aktualisiert.
Im HTML habe ich die Label aus unserem Beispiel einfach nur an die richtigen Stellen kopiert.

Nun müssen wir die Links "Frankreich" und "Großbritannien" mit einem OnClick Event versehen, damit unsere Methode auch aufgerufen wird, wenn wir die Zeit "umstellen" möchten. Hier ein kleines Beispiel:

Innerhalb des Links (also dem "<a>" Element) gibt es ein Attribut "href". Dies bestimmt, was passieren soll wenn man auf einen Link klickt. Normalerweise öffnet man damit eine andere Website. In unserem Fall soll geben wir hier nur # als Platzhalter an. Stattdessen soll beim "OnClick" die Javascript Methode "ClickEventMethode" aufgerufen werden:

JavaScript
<a href="#" onclick="ClickEventMethode('gb'); return false;">Großbritanien</a>

Mit einem Argument "gb". Die Javascript Methode ist definiert als:

JavaScript
function ClickEventMethode(region)
    {
    document.getElementById(
    "clicked"
    ).innerHTML = region;
    }

Der Eingabeparameter "region" wird einfach in das HTML Tag "clicked" eingefügt.

Allerdings wollen wir ja nicht nur die "region" anzeigen, sondern auch den Zeitversatz (offset) zur UTC Zeit, die umgerechnete Uhrzeit, das Land und die Hauptstadt.
Diese Informationen müssen wir erst einmal herausfinden und dann im Code definieren. Für Großbritanien, Frankreich und Deutschland sind folgende Informationen bekannt:

Region Zeitversatz zu UTC Zeitzone Land Hauptstadt
gb 0 UTC Großbritannien London
fr 60 UTC+1 Frankreich Paris
de 60 UTC+1 Deutschland Berlin

Hinweis: Die Werte in der Tabelle gelten nur für die Winterzeit. Im Sommer (Sommerzeit/DST) verschieben sich alle drei Zeitzonen um eine weitere Stunde, z. B. wird aus "gb: 0" dann "gb: +1". Warum ein fester Zahlenwert dafür nicht ausreicht, erkläre ich gleich im Anschluss.

Wie wir sehen können haben Deutschland und Frankreich die gleiche Zeitzone und daher die gleiche Zeit.

Wichtig: Warum ein fester Zeitversatz nicht funktioniert

Die Tabelle oben zeigt für jedes Land nur einen festen Zeitversatz zur UTC-Zeit (z. B. "gb: 0", "fr: 60"). Das Problem: Diese Werte gelten nur für die Winterzeit (Standardzeit). Fast alle hier gezeigten Länder (Großbritannien, Frankreich, Deutschland, die USA, ...) stellen im Frühjahr die Uhr eine Stunde vor (Sommerzeit) und im Herbst wieder zurück. Das Datum, an dem das passiert, ist außerdem nicht überall gleich, und manche Länder (z. B. China) haben gar keine Sommerzeit.

Ein einziger, fest in den Code geschriebener Zahlenwert kann das nicht abbilden — er ist automatisch zweimal im Jahr falsch, sobald sich irgendwo die Sommer-/Winterzeit ändert. Genau das war der Grund, warum die Uhrzeit für Großbritannien auf dieser Seite eine Zeit lang falsch angezeigt wurde: Der Code ging fest von "UTC+0" für Großbritannien aus, ignorierte aber, dass dort im Sommer "UTC+1" (British Summer Time) gilt.

Die robuste Lösung: Statt einen Offset selbst zu berechnen, fragen wir den Browser über die eingebaute

Intl.DateTimeFormat
-Funktion nach der Uhrzeit in einer bestimmten Zeitzone — angegeben über ihren offiziellen Namen (z. B.
"Europe/London"
). Diese Zeitzonen-Namen (sogenannte "IANA-Zeitzonen") sind im Browser hinterlegt und enthalten bereits alle Regeln dazu, wann und ob in dieser Zeitzone auf Sommerzeit umgestellt wird. Damit müssen wir selbst gar nicht mehr wissen, ob und wie viel Sommerzeit gerade gilt — der Browser rechnet das für uns korrekt aus.

Ab dem übernächsten Beispiel (mit den Javascript-Objekten) verwenden wir daher statt
offset
ein Feld
timeZone
mit so einem Zeitzonen-Namen, und statt der manuellen Offset-Rechnung nutzen wir
Intl.DateTimeFormat
.

Die Zeitzonenzuordnung zu den Ländern müssen wir nun in unsere Programmierung einarbeiten. Es gibt dafür verschiedene Möglichkeiten. Ich stelle euch hier mal zwei vor.

1. Implementierung mittels "if" Anweisung:

2. Implementierung mittels Javascript Objekten

Die zweite Implementierung mittels Javascript Objekten hat den Vorteil, dass die Daten leichter geändert werden können und es dadurch übersichtlicher ist. Ich habe hier ein Array (also eine Art Liste) von Objekten mit verschiedenen Eigenschaften definiert. Was Javascipt Objekte genau sind und wie sie funktionieren möchte ich hier offen lassen da dies den Rahmen zum Uhr Programmieren sprengen würde. Eventuell erstelle ich einmal ein separates Tutorial dazu.
Im Folgenden werden wir auf jeden Fall die Javascript Objekte verwenden, damit wir diese später leichter Erweitern können.

Lasst uns daher nun die Javascript Objekte in unsere eigentliche Weltzeituhr hinzufügen:

Nun gibt es aber ein Problem. Man kann zwar ein Land anklicken, aber die Zeit läuft nicht weiter. Also lasst uns das Lösen. Wir definieren einfach eine weitere globale Variable "selectedRegion" und setzen diese, wenn auf ein Land geklickt wurde. Und wir nutzen unsere "SetTimeout" Methode um die bestehende "SetTime_SelectedRegion" Methode ohne Parameter aufzurufen:

Nun funktioniert die Umrechnung der Zeit sehr gut. Erweitern wir nun unsere Liste der Länder. Wie ihr sehen werdet habe ich einfach nur die Javascript Objekte erweitert und die Links zum Anklicken hinzugefügt. Mehr ist nicht notwendig:

Als nächstes kümmern wir uns um das Design. Zuerst entfernen wir die Überschriften "Uhrzeit" und "Land" und weisen unserer Tabelle, den Spalten und Zeilen CSS Klassen zu:

Nun füllen wir die CSS Klassen nach belieben ;-). Ihr könnt wie immer gerne direkt im Editor etwas ändern und euch ausprobieren:

Als letztes habe ich mir Flaggen statt der Länderbezeichnung gewünscht, da dies ansprechender aussieht. Hierfür nutze ich Flaggen einer frei zugänglichen Quelle (www.welt-flaggen.de):

Ich hoffe ich konnte alles verständlich rüber bringen. Falls nicht, dann nutzt die Kontaktmöglichkeiten und schreibt mir eure Fragen oder Anmerkungen.
Falls Ihr Lust habt noch etwas selbst auszuprobieren, dann hier ein paar kleine Aufgaben:

  • Erweitert den Code so, dass auch die Zeitzone von China (inkl. Flagge) angezeigt wird. Kleiner Tipp, die Flagge findet ihr mittels der Region "cn".
  • Überarbeitet die Farben der Tabelle mit euren Lieblingsfarben. Vielleicht Lila, Rot oder Blau.
  • Erweitert die Links der Flaggen so, dass man als Toolip (nutzt hierfür zum Beispiel das "title" Attribute) das Land sieht.
  • Sehr schwierige Aufgabe: Erweitert die Links der Flaggen so, dass man als Toolip (nutzt hierfür zum Beispiel das "title" Attribute) das man direkt die Zeit im jeweiligen Land sieht.

Ich wünsche euch viel Spaß beim Lösen der Aufgaben.

Als nächstes möchte ich mich der Programmierung eines Timer (Zeit herunterlaufen lassen) widmen. Wenn ihr auch wissen möchtet, wie das funktioniert, dann schau es dir gerne hier an: Countdown-Timer programmieren.