Datum und Uhrzeit
Das aktuelle Datum und die aktuelle Uhrzeit zu erhalten ist essentiell für viele Anwendungen. In diesem Artikel lernt ihr, wie ihr das Datum und die Uhrzeit ausgeben könnt und wie ihr mit dem Datum rechnen könnt um beispielsweise vergangene oder zukünftige Termine bestimmen zu können.
Inhaltsverzeichnis
Timestamp und Datum
Oft ist es interessant zu wissen, wann etwas gespeichert wurde, deswegen unterstützt PHP auch Datums- und Uhrzeitangaben.
Das Datum und die Zeit werden von der Server Uhr abgelesen und können somit nicht von dem Anwender manipuliert werden, allerdings sollte die Server Uhr dann auch richtig gehen.
In PHP ermittelt man die Uhrzeit zuerst mit einem UNIX-Timestamp. Dieser beinhaltet alle Sekunden seit dem 1.1.1970 um 0:00 Uhr. Dadurch entsteht so ein Wert: 1435085512
Mit diesem Wert können wir noch nicht viel Anfangen, aber PHP darum um so mehr.
Aber zuerst brauchen wir den Timestamp, das geht so:
<?php $timestamp = time(); echo $timestamp; ?>
Mit dem Befehl time() ermitteln wir den aktuellen Timestamp und dieser wird in der Variable $timestamp gespeichert.
Jetzt gibt es die Funktion date($format, $timestamp) .
Um jetzt ein Datum auszugeben, wenden wir den Befehl date mal an:
<?php $timestamp = time(); $datum = date("d.m.Y - H:i", $timestamp); echo $datum; ?>
Das Ergebnis beispielsweise so aus:
01.02.2016 - 20:51
Der erste Parameter der date-Funktion ist ein Formatierungsstring für das Datum. Das d gibt an, das wir gerne den Wochentag (day) haben möchte, das m den Monat, das Y das Jahr (year), das H die Stunden (hour) und das i die Minuten. In der folgenden Tabelle findet ihr die wichtigsten Formatierungsmuster.
Format | Funktion | Beispiel |
---|---|---|
d | Tag des Monats, zweistellig | 04, 15 |
j | Tag des Monats, einstellig | 5, 23 |
m | Nummer des Monats, zweistellig | 05, 12 |
n | Nummer des Monats, einstellig | 4, 11 |
y | Jahr, zweistellig | 98, 05 |
Y | Jahr, vierstellig | 1998, 2005 |
H | Stunden im 24-Stunden-Format, zweistellig | 04, 18 |
G | Stunden im 24-Stunden-Format, einstellig | 4, 14 |
i | Minuten, zweistellig | 04, 32 |
s | Sekunden, zweistellig | 02, 55 |
w | Wochentag in Zahlenwert, 0 für Sonntag, 6 für Samstag | 1, 5 |
Den zweiten Parameter von date muss ein Timestamp sein, d.h. die Sekunden seit 1970. Dieses Argument könnt ihr auch weglassen, in dem fall wird immer vom aktuellen Timestamp ausgegangen:
<?php $datum = date("d.m.Y - H:i"); echo $datum; ?>
Habt ihr einen Timestamp abgespeichert, beispielsweise wann sich ein Benutzer registriert hat, dann könnt ihr diesen Timestamp per date in ein lesbares Format übersetzen sofern ihr ihn als zweiten Parameter.
Zeitspannen umrechnen
Manchmal möchte man wissen, vor wie vielen Minuten, Stunden oder auch Tagen etwas geschrieben wurde.
Man könnte jetzt denken, dies würde so gehen, aber das ist falsch:
<?php $timestamp = "120"; $test = date("i", $timestamp); echo $test; ?>
Hier bekommen wir als Ausgabe 02, weil 120 Sekunden 2 Minuten sind. Aber gebt dort anstatt eine 120 eine 10900 ein. Das wären dann natürlich viel mehr als 2 Minuten (181 Min.), aber als Ausgabe erhalten wir 01. Das kommt, weil PHP immer die Minuten für eine bestimmte Uhrzeit angibt, und das ist natürlich nicht richtig. Mit etwas Mathe können wir dieses aber lösen.
Wie wir wissen, hat 1 Minute 60 Sekunden, also teilen wir die Sekunden einfach durch 60.
<?php $timestamp = "120"; echo round($timestamp / 60); ?>
Mit round() lassen wir den Wert auf, bzw. abrunden. Möchtet ihr den Wert immer abrunden, so benutzt anstatt round einfach floor() . Wollt ihr immer aufrunden, dann könnt ihr ceil() als Funktion verwenden.
Ausgabe des Wochentages
Manchmal möchte man den Wochentag ausgeben. PHP selber kann nur die Wochentage in der englischen Schreibweise ausgeben, aber wir möchten ja die deutsche Schreibweise benutzen. Hierfür verwenden wir die im vorherigen Artikel kennengelernten Arrays.
Als erstes erstellen wir ein Array mit allen deutschen Wochentagen:
1 2 3 |
<?php $tage = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"); ?> |
Um jetzt den richtigen Tag auszugeben, verwenden wir so eine Ausgabe: $tage[Nummer]
Um die Nummer des Tages zu bekommen, benutzen wir wieder die date-Funktion:
1 2 3 |
<?php $tag = date("w"); ?> |
Das Format w gibt uns den Wochentag zurück. Dabei wird der Sonntag als der 0. Wochentag angesehen, weswegen wir unser Array oben auch mit Sonntag als ersten Eintrag beginnen.
Das komplette Script sieht wie folgt aus:
<?php $tage = array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"); $tag = date("w"); echo $tage[$tag] ?>
So kann man auch Monatsnamen ausgeben lassen, allerdings fängt ein Array bei 0 an zu Nummerieren, aber es gibt keinen Monat 0.
Darum müssen wir den Werten des Array die Monatszahl zuordnen:
<?php $monatsnamen = array( 1=>"Januar", 2=>"Februar", 3=>"März", 4=>"April", 5=>"Mai", 6=>"Juni", 7=>"Juli", 8=>"August", 9=>"September", 10=>"Oktober", 11=>"November", 12=>"Dezember"); $monat = date("n"); echo $monatsnamen[$monat]; ?>
Danach fragen wir die Zahl des Monats ab, dies geht mittels date("n"). Zum Schluss wird auf das Array zurück gegriffen und der Monatsname wird ausgegeben.
Vom Datum zu Timestamp & Rechnen mit Daten
Im obigen Beispiel haben wir euch gezeigt, wie man per time() den aktuellen Timestamp erhält und wie man mittels date($format, $timestamp) diesen in ein lesbares Format umwandeln kann. Mit der Funktion
strtotime($datum) können wir den genau anderen Weg gehen und ein (englisches) Datum in den dazugehörigen Timestamp umwandeln:
<?php echo strtotime("09 October 2015")."<br />"; echo strtotime("09.10.2015")."<br />"; echo strtotime("09.10.2015 14:03:02"); ?>
Möchten wir mit Daten rechnen, dann geht dies meistens recht einfach auf der Ebene der Timestamps. Möchten wir die Uhrzeit in einer Stunde bestimmen, dann können wir zu dem Timestamp 60*60=3600 Sekunden (60 Minuten je 60 Sekunden) hinzuaddieren:
<?php $in_einer_stunde = time() + 60*60; echo "In einer Stunde ist es: ".date("H:i:s", $in_einer_stunde); ?>
Darüber können wir sehr leicht das Datum und die Uhrzeit von zukünftigen oder vergangenen Zeitpunkten bestimmen. Angenommen die Registrierung von einem Benutzer ist nur 30 Tage gültig, dann können wir auf den aktuellen Timestamp einfach 30*24*60*60 aufaddieren (30 Tage, je 24 Stunden, je 60 Minuten, je 60 Sekunden) und erhalten den Zeitpunkt zudem die Registrierung des Nutzers abläuft.
Neben diesen Weg über den Timestamp können wir alternativ auch wieder strtotime() verwenden:
<?php echo strtotime("+1 day")."<br />"; echo strtotime("+1 week")."<br />"; echo strtotime("+1 week 2 days 4 hours 2 seconds")."<br />"; echo strtotime("next Thursday")."<br />"; echo strtotime("last Monday")."<br />"; ?>
Mittels strtotime() können wir ebenfalls die Herausforderung lösen, wenn wir den Timestamp von heute in einem Monat erhalten wollen. Da der Monate ja bekanntlich zwischen 28 und 31 Tage haben kann, können wir nicht einfach nur 30 Tage auf den Timestamp aufaddieren. Mittels strtotime() lässt sich dies aber wieder recht einfach lösen:
<?php $heute_in_einem_monat = strtotime("+1 month"); echo date("d.m.Y", $heute_in_einem_monat)."<br />"; ?>