Hier zeige ich euch einige Möglichkeiten, wie ihr eine Uhr programmieren könnt, die die Zeit mit Worten anzeigt. Dafür habe ich diesmal drei verschiedene Wege vorbereitet, aber es gibt sicher noch mehr.
Die erste Methode ist ziemlich einfach gehalten und übersetzt die Zahlen einfach in Wörter. Die zweite Methode zur Programmierung einer Wortuhr ist etwas ausgefallener aber auch etwas schwieriger. Mir gefällt die dritte Möglichkeit zur Programmierung einer Wortuhr am Besten. Diese ist vom Quellcode her leicht zu verstehen und auch leicht zu verändern. Entscheidet selbst, welche ihr bevorzugt.
Das Ziel ist es, eine Uhr zu erstellen, die die Uhrzeit in Worten angibt. Dabei sollte die Uhrzeit einfach lesbar und möglichst genau sein.
Wie immer folgt nun die Schritt-für-Schritt-Erklärung. Bei Fragen einfach fragen.
Die Programmierung der Wort Uhr benötigt etwas Javascript Programmierung. Daher starten wir mit einer neuen Methode "SetTimeToWords_Simple()" die uns erstmal nur die Uhrzeit ausgibt. Diese Methode erweitern wir dann Schritt für Schritt.
Natürlich brauchen wir dafür auch etwas HTML Code um die Zeit auszugeben:
See the Pen Untitled by Fabian (@Onkelllepie) on CodePen.
Wie ihr seht, habe ich folgendes HTML zur Ausgabe der aktuellen Zeit definiert :
<p id="time"></p>
und
<p> <label> Es ist </label> <label id="hourLabel">00</label> <label>uhr</label> <label>und</label> <label id="minuteLabel">00</label> <label>min</label> </p>
Folgender Javascript Code gibt uns die Zeit aus:
function SetTimeToWords_Simple() { // date Variable definieren var date = new Date(); // date Variable als String mit Millisekunden in das Element time schreiben document.getElementById("time").innerHTML = date.toLocaleTimeString() + "." + date.getMilliseconds(); // nur die Stunde der Variable Time in das Element hourLabel schreiben document.getElementById("hourLabel").innerText = date.getHours(); // nur die Minute der Variable Time in das Element minuteLabel schreiben document.getElementById("minuteLabel").innerText = date.getMinutes(); // Methode SetTimeToWords_Simple alle 10 Sekunden aufrufen setTimeout(SetTimeToWords_Simple, 10); } // Erstmaliges Aufrufen der Methode SetTimeToWords_Simple() SetTimeToWords_Simple();
Der Code wurde mit Kommentaren (erkennbar an den // vor dem Text) versehen, damit ihr wisst, was die einzelnen Zeilen bewirken.
Als Ergebnis sehen wir nun die Uhrzeit ganz normal in der Form Stunde:Minute:Sekunde und zusätzlich als einfachen Text. Allerdings werden die Stunden und Minuten immer noch als Zahlen ausgegeben. Das wollen wir im Folgenden ändern. Dafür erstellen wir uns eine einfache Methode, die die Zahl "1" in den Text "eins", die Zahl "2" in den Text "zwei" und so weiter verwandelt:
function NumberToWord(number) { switch (number) { case 0: return "null"; break; case 1: return "ein"; break; case 2: return "zwei"; break; case 3: return "drei"; break; case 4: return "vier"; break; case 5: return "fünf"; break; case 6: return "sechs"; break; case 7: return "sieben"; break; case 8: return "acht"; break; case 9: return "neun"; break; case 10: return "zehn"; break; case 11: return "elf"; break; case 12: return "zwölf"; break; }
Hierzu ein paar Besonderheiten. Zum einen benutzen wir hier einen sogenannten "Switch Case" Befehl. Das heißt, wir übergeben dem Befehl eine Variable, in unserem Fall "number" mit dem Wert 1 oder 2 oder 3 und so weiter.
Mit dem "case" definieren wir, was in einem bestimmten Fall zu tun ist. Zum Beispiel definieren wir mit:
case 1: reurn "eins"; break
das wenn "number" eine "1" ist, dann soll die Methode "eins" zurückgeben.
Probiert es gerne mal aus:
See the Pen Untitled by Fabian (@Onkelllepie) on CodePen.
Ändere oben im JavaScript einfach den Wert "1" unter "eingabeVariable" in "2". Danach wird "zwei" ausgegeben.
Ändere den Wert nun in "3" und es wird "kenne ich nicht" ausgegeben. Denn "3" ist nicht definiert, und daher nutzt der Switch-Case-Befehl die Definition aus der "default"-Implementierung:
default: return "kenne ich nicht"; break;
Erweitert nun den Switch Case Befehl um folgende Definition:
Aber Achtung! Ihr müsst diesen über dem "default" Befehl einfügen.
case 3: return "drei"; break;
Nun sollte "drei" ausgegeben werden. Wenn ihr alles richtig gemacht habt, dann sieht es am Ende so aus:
See the Pen Untitled by Fabian (@Onkelllepie) on CodePen.
Ihr kennt nun den Switch-Case-Befehl. Deshalb zurück zu unserer Wortuhr. Aktuell haben wir nur ein Switch-Case bis 12 programmiert. Da unser Tag aber 24 Stunden hat, müssen wir die Programmierung erweitern.
Außerdem wollen wir auch die Minuten in Worten anzeigen, deshalb benötigen wir sogar eine Programmierung bis 60!
Da das eine sehr lange Methode wäre, habe ich versucht dieses Problem etwas eleganter zu lösen:
Wie ihr wisst, sind die Zahlen bis 20 immer eindeutig, aber ab der 21 ändert sich im 10er-Rhythmus immer nur die Zahl vorne. Also 21 und 31 oder 22 und 32 oder 23 und 33 und so weiter:
1 | eins | 11 | elf | 21 | ein und zwanzig | 31 | ein und dreißig | 41 | ein und vierzig | 51 | ein und fünfzig |
2 | zwei | 12 | zwölf | 22 | zwei und zwanzig | 32 | zwei und dreißig | 42 | zwei und vierzig | 52 | zwei und fünfzig |
3 | drei | 13 | drei zehn | 23 | drei und zwanzig | 33 | drei und dreißig | 43 | drei und vierzig | 53 | drei und fünfzig |
4 | vier | 14 | vier zehn | 24 | vier und zwanzig | 34 | vier und dreißig | 44 | vier und vierzig | 54 | vier und fünfzig |
5 | fünf | 15 | fünf zehn | 25 | fünf und zwanzig | 35 | fünf und dreißig | 45 | fünf und vierzig | 55 | fünf und fünfzig |
6 | sechs | 16 | sechs zehn | 26 | sechs und zwanzig | 36 | sechs und dreißig | 46 | sechs und vierzig | 56 | sechs und fünfzig |
7 | sieben | 17 | sieb zehn | 27 | sieben und zwanzig | 37 | sieben und dreißig | 47 | sieben und vierzig | 57 | sieben und fünfzig |
8 | acht | 18 | acht zehn | 28 | acht und zwanzig | 38 | acht und dreißig | 48 | acht und vierzig | 58 | acht und fünfzig |
9 | neun | 19 | neun zehn | 29 | neun und zwanzig | 39 | neun und dreißig | 49 | neun und vierzig | 59 | neun und fünfzig |
10 | zehn | 20 | zwanzig | 30 | dreißig | 40 | vierzig | 50 | fünfzig | 60 | sechzig |
Wir sehen hier einige Besonderheiten:
Daher kann man folgende Methode programmieren:
See the Pen Untitled by Fabian (@Onkelllepie) on CodePen.
Im obigen Code gibt es eine Methode "NumberToWord", die eine Variable "Number" erwartet.
Darin wird ein Array (eine Liste von Werten) definiert. Diese Liste enthält alle Zahlen von 1 bis 9 und deren Äquivalent (also Übersetzung) in Worten.
Als nächstes wird in einer if-Anweisung (also eine "Wenn -> Dann"-Anweisung) überprüft, ob der Wert in "number" größer als 20 und kleiner als 30 ist. Falls ja:
Dann wird aus dem Array der Wert an der Position "number-20" geladen und mit "undzwanzig" verknüpft. Zum Beispiel, wenn "number" 22 ist, wird der Wert an der Position 2 im Array geladen, was "zwei" entspricht. Dieser Wert wird mit "undzwanzig" verknüpft, also "zwei" + "undzwanzig" ergibt "zweiundzwanzig".
Falls nein, wird geprüft, ob der Wert zwischen 30 und 40 liegt. Falls ja, wird wieder der Wert aus dem passenden Array-Eintrag geladen und mit "unddreißig" verknüpft.
Und so weiter... Probiert es im obigen Code gerne mal aus und ändert den Wert "var number = 22;" auf 35 oder 47.
Hier findet ihr nun die komplette Methode mit dem Switch Case Befehl und der Array Implementierung von Zahlen in Worte:
See the Pen Untitled by Fabian (@Onkelllepie) on CodePen.
Nun klingt vielleicht alles sehr logisch und nachvollziehbar, was ihr gelesen habt. Aber es ist schöner, auszuprobieren, ob unsere Programmierung auch immer funktioniert.
In einem professionellen Projekt würde man einen Test programmieren und damit prüfen, ob der Code immer korrekt funktioniert. (Das machen wir jetzt mal nicht, weil es sehr theoretisch ist und man nicht viel sieht. Falls ihr Interesse daran habt, dann schreibt mir einfach, und ich werde eine extra Seite dazu posten.)
Aber wir begnügen uns damit, mit unseren eigenen Augen zu prüfen, ob alles funktioniert. Vermutlich habt ihr jedoch keine Lust, den ganzen Tag vor dem Bildschirm zu sitzen und die Uhr zu beobachten.
Deshalb stelle ich euch hier eine Möglichkeit vor, um den Tag etwas schneller vergehen zu lassen und die Uhr vorzudrehen.
Oben habt ihr sicherlich den Strich mit dem Punkt unter der Wortuhr bemerkt (auch Slider genannt). Damit könnt ihr die Zeit schneller vergehen lassen. Zieht den Punkt einfach nach rechts, und die Zeit vergeht schneller. Hier der Code dazu:
See the Pen Untitled by Fabian (@Onkelllepie) on CodePen.
Wie funktioniert das? - Wie ihr im Code oben sehen könnt, wurde eine Date-Variable "dateTimeToWords" außerhalb, also nicht in einer Methode, sondern "Global" definiert:
var dateTimeToWords = new Date();
Dann wurde eine Methode "fastForward" programmiert, die in diese Variable immer als neues Datum plus einen Wert neu setzt:
function fastForward() { ... dateTimeToWords = new Date( dateTimeToWords.getTime() + milliSecsInputFastForward ); }
Die Zahl "milliSecsInputFastForward" ist der Wert vom Schieberegler, der zwischen 1 und 600.000 liegt. Jedes Mal, wenn wir die "fastForward"-Methode aufrufen, schauen wir auf die aktuelle Zeit in der "dateTimeToWords"-Variable und fügen die Millisekunden hinzu, die wir auf dem Schieberegler ausgewählt haben.
Um das besser zu verstehen: Stellt euch vor, "dateTimeToWords" zeigt auf den 01.01.1971 um 00:00:00.100 Uhr, also 100 Millisekunden nach Mitternacht am 01.01.1970. Die Funktion "getTime()" gibt uns die Millisekunden seit dem 01.01.1970 00:00:00 zurück. In diesem Beispiel sind das also 100. Wenn der Schieberegler nun auf 200 eingestellt ist, setzen wir die Zeit auf den 01.01.1971 00:00:00.300, also 200 Millisekunden später als die Uhr eigentlich anzeigen sollte.
Das passiert jedes Mal. Im nächsten Durchlauf sind dann 100 Millisekunden vergangen: 00:00:00.200 ist die eigentliche Uhrzeit, aber die Variable zeigt 00:00:00.300 an. Dann addieren wir 200 dazu, und es wird 00:00:00.500. So vergehen innerhalb von 100 Millisekunden auf unserer Uhr tatsächlich 400 Millisekunden.
Mit dieser Methode können wir die Zeit schneller laufen lassen und genau beobachten, wie sich unsere Uhr verhält.
Zurück zum Code. Im HTML ist der Slider definiert:
<input id="fastForwardMilliseconds" type="range" min="100" max="600000" value="100">
Im Javacript wird der "Value", also der ausgewählte Wert mittels "document.getElementById("fastForwardMilliseconds").value" ausgelesen und als eine Ganzzahl interpretiert (Ganzzahl = Integer = Int, parse = interpretieren 0> parseInt = als Integer interpretieren):
var milliSecsInputFastForward = parseInt( document.getElementById("fastForwardMilliseconds").value );
Dieser Wert wird in der Variable "milliSecsInputFastForward" gespeichert und dann in einem Text angezeigt und eben für die Berechnung der neuen Uhrzeit verwendet:
// Anzeigen des ausgewählten Wertes - eigentlich nicht notwendig document.getElementById( "fastForwardMillisecondsDisplay" ).innerText = milliSecsInputFastForward; // Erzeugen der neuen Uhrzeit mit dem ausgewählten Beschleunigungsfaktor dateTimeToWords = new Date( dateTimeToWords.getTime() + milliSecsInputFastForward );
Die Methode "fastForward" wird über "getTimeout(fastForward,100)" alle 100 Millisekunden aufgerufen. Daher ist 100 als Standardwert definiert. Die Uhrzeit entspricht damit, mehr oder weniger, genau der aktuellen Uhrzeit.
setTimeout(fastForward, 100);
Nur wenn ein größerer Wert als 100 ausgewählt wird, wird die Zeit beschleunigt.
Damit man direkt sieht, was passiert, wenn man die Zeit beschleunigt laufen lässt, habe ich auch die vorangegange Programmierung hinzugefügt.
Man sieht damit wie sich unser Text "Es ist HH Uhr und MM Minuten" verändert, wenn man ihn schnell laufen lässt.
Wichtig hierbei ist, dass die genutzte Variable für die Zeit nun "dateTimeToWords" und nicht mehr "date" ist!
Alter Code:
function SetTimeToWords_Simple() { var date = new Date(); document.getElementById("hours_TimeToWords").innerHTML = "<em>" + NumberToWord(date.getHours()) + "</em>"; document.getElementById("minutes_TimeToWords").innerHTML = "<em>" + NumberToWord(date.getMinutes()) + "</em>"; setTimeout(SetTimeToWords_Simple, 10); }
Neuer Code:
function SetTimeToWords_Simple() { document.getElementById("hours_TimeToWords").innerHTML = "<em>" + NumberToWord(dateTimeToWords.getHours()) + "</em>"; document.getElementById("minutes_TimeToWords").innerHTML = "<em>" + NumberToWord(dateTimeToWords.getMinutes()) + "</em>"; setTimeout(SetTimeToWords_Simple, 10); }
Nun ist unsere erste Variante für eine Wort Uhr fertig programmiert. Fast... . Denn mir ist ein kleiner Fehler aufgefallen. Wenn Ihr oben mal die Zeit auf 13:01 stellt, dann fällt euch vielleicht auf, dass dann "es ist dreizehn Uhr und ein Minuten" angezeigt wird. Das stimmt so leider nicht und müsste eigentlich "es ist dreizehn Uhr und eine Minute" lauten.
Deshalb habe ich den Code nochmals verändert. Ich habe eine Methode erstellt, die den Sonderfall "eine Minute" behandelt:
function NumberToWordOneException() { // Aktuelle Minute auslesen var minuteDateTimeToWords = dateTimeToWords.getMinutes(); // Prüfen ob diese genau 1 ist if (minuteDateTimeToWords == 1) { // Die Zeit ist genau 1, // also "Minute" statt "Minuten" anzeigen document.getElementById("minuteLabel_TimeToWords").innerText = "Minute"; // also "eine" statt "ein" anzeigen document.getElementById("minutes_TimeToWords").innerHTML = "<em>" + "eine"+ "</em>"; } else // Die Zeit ist ungleich 1, somit "Minuten" anzeigen document.getElementById("minuteLabel_TimeToWords").innerText = "Minuten"; }
Hierbei wird die aktuelle Minute ausgelesen. Wenn diese 1 ist, dann wird "eine Minute" angezeigt, statt "ein Minuten". Wenn diese ungleich 1 ist, dann wird "Minuten" angezeigt und die bestehende Übersetzung in Worte genutzt.
See the Pen Untitled by Fabian (@Onkelllepie) on CodePen.
Nun sind wir hoffentlich wirklich fertig mit der Programmierung und niemand von euch findet einen weiteren Fehler. Falls doch, dann meldet euch bitte über das Kontaktformular.
Allerdings sieht die Wort Uhr noch sehr einfach aus. Deshalb wollen wir mit etwas CSS das Design der Wort Uhr ändern. Ich dachte mir, ich gebe der Uhr einen hellblauen Hintergrund, zeichne einen Rahmen drumherum und setze die Schriftfarbe auf weiß. Gedacht getan:
.watchText { font-family: Verdana; font-size: 22px; font-weight: 500; text-align: center; color: #f8f8ff; } .watchText_Frame { border-style: solid; border-color: #d3d3d3; border-radius: 25px; border-width: 10px; background-color: #87ceff; padding: 10px 20px 5px 20px; color: #f8f8ff; font-family: Verdana; font-size: 22px; font-weight: 500; text-align: center; }
Damit sieht unsere Uhr dann so aus:
See the Pen Untitled by Fabian (@Onkelllepie) on CodePen.
Hier eine kurze Beschreibung der CSS Eigenschaften, damit ihr wisst welcher Wert was bedeutet:
Die CSS Klasse WatchText_Frame gibt die Hintergrndfarbe und die Textgestaltung an:
border-style: solid; | Gibt die Art des Rahmens an. |
border-color: #d3d3d3; | Gibt die Farbe des Rahmens an. |
border-radius: 25px; | Gibt die Rundung des Rahmens an. |
border-width: 10px; | Gibt die Breite des Rahmens an. |
background-color: #87ceff; | Gibt die Hintergrundfarbe an. |
padding: 10px 20px 5px 20px; | Gibt die Entfernung zu Rahmen an. |
color: #f8f8ff; | Gibt die Schriftfarbe an. |
font-family: Verdana; | Gibt die Schriftart an. |
font-size: 22px; | Gibt die Schriftgröße an. |
font-weight: 500; | Gibt die Dicke der Schrift an. |
text-align: center; | Gibt an, dass der Text in der Mitte zentriert werden soll. |
Probiert es gerne mal aus und ändert die Werte. Zum Beispiel die Schriftfarbe oder den Hintergrund. Ihr bekommt sicher ein noch schöneres Ergebnis hin.
Wie ihr seht ist Variante 1 die genaue Angabe der Uhrzeit in Stunde und Minute, nur als Text.
Variante 2 soll die Uhrzeit nur "ungefähr" angeben. Also zum Beispiel für 12:13, soll angezeigt werden "Es ist kurz vor viertel Eins". Hier erläutere ich wie ich die zweite Variante der Wort Uhr programmiert habe.
Hier nochmal der Vergleich der beiden Varianten.
See the Pen Wortuhr Variante 1 by Fabian (@Onkelllepie) on CodePen.
See the Pen Wortuhr Variante 2 by Fabian (@Onkelllepie) on CodePen.
Variante 2 arbeitet mit Arrays, das sind sozusagen Listen von Informationen. In diesem Fall enthalten sie Angaben über einen bestimmten Zeitraum und den dazugehörigen Text, der angezeigt werden soll.
Ein Beispiel: "0-5|Es ist gegen [Stunde]" bedeutet, dass wenn die Minuten einer Stunde zwischen 0 und 5 liegen, dann soll der Text "Es ist gegen" angezeigt werden, gefolgt von der aktuellen Stunde. Zum Beispiel, wenn es 12:02 ist, wird angezeigt: "Es ist gegen 12". Das Wichtige, also die Uhrzeit, wird dabei besonders hervorgehoben, indem sie mit einem HTML "b"-Tag umschlossen wird und somit fett dargestellt wird.
Im JavaScript-Code wird mit einer sogenannten "Foreach"-Schleife gearbeitet, das bedeutet, dass für jedes Element in einer Liste eine bestimmte Aktion ausgeführt wird. Die Definition, die den Zeitraum und den Text enthält, wird ausgelesen und verarbeitet. Die Definition wird durch das Zeichen "|" (Pipe) getrennt.
Der Zeitraum wird dann weiter in Startzeitraum und Endzeitraum unterteilt. Der Startzeitraum steht am Anfang, daher wird er mit var startIndex = timeAndTextDefinitionItem.split("|")[0].split("-")[0];
extrahiert. Der Endzeitraum steht nach dem Minus und wird mit var endIndex = timeAndTextDefinitionItem.split("|")[0].split("-")[1];
extrahiert.
Anschließend wird verglichen, ob der aktuelle Zeitraum zwischen dem Start- und Endzeitraum liegt. Wenn dies der Fall ist, wird der dazugehörige Text gesetzt. Dieser Text wird zuvor ausgelesen und der Platzhalter "[Stunde]" bzw. "[Stunde+1]" wird durch die entsprechende Stundenangabe ersetzt.
So wird die zweite Wortuhr programmiert.
See the Pen Wortuhr Alernative 2 by Fabian (@Onkelllepie) on CodePen.
Die dritte Variante der Wortuhr basiert auf einfachen If-Anweisungen. CSS und HTML sind genau wie bei den anderen Varianten. Nur der Javascript Code ändert sich.
Hier wird die Funktion SetTimeToWords_ByIfDefinition programmiert. Diese erfüllt verschiedene Aufgaben. Hier ist eine zusammenfassende Erklärung:
1. Zeitangabe erstellen:
Die Funktion startet mit der Anzeige der aktuellen Uhrzeit und Millisekunden in einem HTML-Element mit der ID "time". Dadurch wird die Echtzeituhr visualisiert.
document.getElementById("time").innerHTML = dateTimeToWords.toLocaleTimeString() + "." + dateTimeToWords.getMilliseconds();
2. Fallbasierte Textgenerierung:
Der Hauptteil der Funktion besteht aus einer Reihe von if- und else if-Anweisungen, die die aktuelle Minutenanzahl überprüfen. Abhängig von dieser Minutenanzahl wird ein bestimmter Text generiert und in der Variable text aufgebaut.
Beispiel: Wenn die Minutenanzahl genau 0 ist, wird der Text "genau [aktuelle Stunde] Uhr" erstellt und in text gespeichert. Falls die Minutenanzahl weniger als 5 ist, wird der Text "fast fünf Minuten nach [aktuelle Stunde]" generiert. Die aktuelle Stunde wird dabei in Worten und fett dargestellt.
if (dateTimeToWords.getMinutes() == 0) { text += "genau <b>" + NumberToWordMax12Hours(dateTimeToWords.getHours()) + "</b> Uhr"; } else if (dateTimeToWords.getMinutes() <= 5) { if (dateTimeToWords.getMinutes() < 5) { text += "fast "; } text += "<b>fünf</b> Minuten nach <b>" + NumberToWordMax12Hours(dateTimeToWords.getHours()) + "</b> "; } // Weitere Bedingungen für verschiedene Zeitintervalle...
3. Aktualisierung alle 10 Millisekunden:
Wie immer verwendet die Funktion setTimeout, um sich selbst alle 10 Millisekunden erneut aufzurufen. Dadurch wird die Anzeige dynamisch aktualisiert und die Uhrzeit in Echtzeit dargestellt.
setTimeout(SetTimeToWords_ByIfDefinition, 10);
4. Besondere Betonung in HTML:
Der generierte Text wird durch die Verwendung von HTML-Tags wie <b> und </b> betont. Beispielsweise wird die aktuelle Stunde fett dargestellt.
text += "genau <b>" + NumberToWordMax12Hours(dateTimeToWords.getHours()) + "</b> Uhr";
Die Funktion ermöglicht eine flexible Anpassung des angezeigten Textes basierend auf den aktuellen Minuten der Uhrzeit und bietet gleichzeitig eine visuelle Darstellung der Echtzeituhr. Die genaue Funktionalität hängt von anderen im Code definierten Funktionen und Variablen ab, insbesondere von dateTimeToWords und NumberToWordMax12Hours.
Das Ergebnis seht ihr hier:
See the Pen Untitled by Fabian (@Onkelllepie) on CodePen.
Ich hoffe euch gefällt eine der Wortuhren und programmiert selbst ein wenig um dabei zu lernen wie die Wortuhren funktionieren. Wenn ihr mögt, habe ich hier einige Aufgaben für euch.
Ich wünsche euch viel Spaß dabei, schickt mir gerne eure Ergebnisse und bei Fragen, wie immer, einfach fragen.