PHP: Zeit und Datum
Die Funktionen time() und date()
PHP biete die Möglichkeit, vergangene, gegenwärtige sowie zukünftige Zeitpunkte sekundengenau zu beschreiben und formatiert auszugeben. Grundlage all dieser Funktionen ist der so genannte timestamp. Dieser Zeitstempel enthält die Sekunden, die seit Beginn der so genannten Unix-Zeit vergangen sind. So kann auf einfache Weise ein Zeitpunkt beschrieben werden. Ein Vorteil dieser technischen Schreibweise gegenüber der, die für Menschen üblich ist, liegt auch darin, dass Zeitwerte so leichter sortierbar sind.
Um den aktuellen UTC-Zeitstempel zu erhalten, wird die Funktion time() verwendet. Da dieser Wert für Menschen keinen großen Aussagewert hat, bietet PHP die Funktion date(), mit der ein Zeitstempel in lesbare Formate umgewandelt werden kann. Dazu muss allerdings die Zeitzone angegeben werden, in die der Zeitstempel für die Ausgabe umgerechnet werden soll. Dies geschieht hier im Beispiel für Berlin.
<?php
date_default_timezone_set('Europe/Berlin');
$now = time();
$format = "l, F jS Y, h:i:s \h\o\u\\r\s a";
echo date($format, $now)."<br>";
echo "Timestamp: ".$now;
?>
Die Funktion date() verlangt neben dem Zeitstempel noch einen Formatierungsstring, anhand dessen diese Funktion den Zahlenwert des Zeitstempels in lesbare Form umwandelt. Jedes Zeichen dieses Strings steht in der Regel stellvertretend für ein bestimmtes Format einer Zeitkomponente. Zeichen in diesem String, die mit keiner Bedeutung belegt sind, werden so ausgegeben, wie sie sind (z. B. Interpunktionszeichen). Möchte man allerdings Zeichen verwenden, die mit einer Bedeutung belegt sind, muss man diese mit einem Backslash \ escapen (s. Beispiel ›hours‹). Im Beispiel muss der Buchstabe r doppelt escapet werden, da er sonst als Wagenrücklauf \r interpretiert wird.
Es wird empfohlen, innerhalb eines Skriptes den Wert der Funktion time() einer Variablen zuzuordnen (hier: $now) und diese Variable im weiteren Verlauf des Skriptes zu verwenden, statt die Funktion time() immer wieder neu aufzurufen, da sich der Wert jedesmal geringfügig ändert und es so theoretisch zu abweichenden Ergebnissen kommen kann.
Hier eine Liste mit den Zeichen und ihren Bedeutungen. Die Ausgabe von Textformaten erfolgt standardmäßig in englischer Sprache.
j – Tag des Monats ohne führende 0
d – Tag des Monats mit führender 0
S – englische Ordnungszeichen st, nd, rd, th
w – Wochentag als Zahl (Sonntag = 0)
N – Wochentag als Zahl (Montag = 1; Sonntag = 7)
D – Wochentag als String mit drei Zeichen
l – Wochentag als String
n – Monat ohne führende 0
m – Monat mit führender 0
M – Name des Monats als String mit drei Zeichen
F – Name des Monats als String
y – Jahr mit zwei Stellen
Y – Jahr mit vier Stellen (auch o)
g – Stunde im 12-Stunden-Format ohne führende 0
h – Stunde im 12-Stunden-Format mit führender 0
G – Stunde im 24-Stunden-Format ohne führende 0
H – Stunde im 24-Stunden-Format mit führender 0
a – am bzw. pm
A – AM bzw. PM
i – Minuten mit führender 0
s – Sekunden mit führender 0
t – Anzahl der Tage des Monats
W – Woche des Jahres nach ISO-8601
z – Tag des Jahres (1. Januar = 0)
I – Prüft, ob sich der Zeitpunkt in der Sommerzeit befindet
L – Prüft, ob sich der Zeitpunkt in einem Schaltjahr befindet
U – Sekunden seit Beginn der Unix-Zeit
B – Swatch Internetzeit
c – Datum im ISO-8601-Format
r – Datum nach RFC 2822
O – Differenz zur GMT in Stunden
P – Wie O mit Trennzeichen : zwischen Stunden und Minuten
Z – Beginn der Zeitzone in Sekunden, relativ zu UTC
e - Standort des Servers
T – Zeitzone des Servers
Um eine Zeitangabe in deutscher Sprache zu erhalten, kann man die Textausgabe über Arrays steuern, die die deutschen Begriffe enthalten. Um das gewünschte Element des Arrays zu erhalten, wird die numerische Ausgabe der date()-Funktion verwendet.
<?php
date_default_timezone_set('Europe/Berlin');
$tage = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"];
$monate = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];
$now = time();
echo "Heute ist ".$tage[date("w", $now)].", der ".date("j", $now).". ".$monate[date("n", $now)-1]." ".date("Y", $now).".<br>";
echo "Today is ".date("l", $now).", ".date("F", $now)." ".date("j", $now)."<sup>".date("S", $now)."</sup> ".date("Y", $now).".";
?>
Ähnliche Ausgabe mit getdate()
In ähnlicher Weise erzeugt die Funktion getdate() ein Array mit elf verschiedenen Elementen, die ebenfalls einen Zeitstempel in dessen Komponenten zerlegt:
<?php
date_default_timezone_set('Europe/Berlin');
$now = time();
$date = getdate($now);
echo "Day of the week: ".$date['weekday']." (".$date['wday'].")<br>";
echo "Date: ".$date['month']." (".$date['mon'].") ".$date['mday'].", ".$date['year']."<br>";
echo "Time: ".$date['hours'].":".$date['minutes'].":".$date['seconds']."<br>";
echo "Day of the year: ".$date['yday']."<br>";
echo "Seconds since Unix Epoch: ".$date['0']."<br>";
echo "Timestamp: ".$now;
?>
Zeitstempel erstellen mit mktime()
Mit der Funktion mktime() kann man umgekehrt aus einer Zeitangabe (in Zonenzeit) einen Zeitstempel erstellen. Dazu müssen die Zeitwerte als Werte der Funktion angegeben werden.
<?php
date_default_timezone_set('Europe/Berlin');
$now = time();
$date = getdate($now);
$hour = $date['hours'];
$minute = $date['minutes'];
$second = $date['seconds'];
$day = $date['mday'];
$month = $date['mon'];
$year = $date['year'];
echo "mktime(): ".mktime($hour, $minute, $second, $month, $day, $year)."<br>";
echo "Timestamp: ".$now;
?>
Zeitstempel aus Zeichenkette bilden mit strtotime()
Die Funktion strtotime() bietet die Möglichkeit, aus einem Text, der eine Zeitangabe in englischer Sprache enthält, einen Zeitstempel zu machen, sofern die Angabe von PHP verstanden wird.
Für die Berechnung einer Zeitdifferenz wird immer der gegenwärtige Zeitstempel angenommen, es sei denn, es wurde ein anderer Zeitstempel als zweiter Wert an die Funktion übergeben (s. letztes Beispiel).
<?php
date_default_timezone_set('Europe/Berlin');
$format = "l, F jS Y, H:i:s a";
$time = strtotime("24 July 2007 16:23:34");
echo date($format, $time)."<br>";
$time = strtotime("24 July"); # wird keine Zeit angegeben, wird 00:00 Uhr angenommen
echo date($format, $time)."<br>";
$time = strtotime("August"); # wird nur der Monat angegeben, wird das gegenwärtige Datum angenommen
echo date($format, $time)."<br>";
$time = strtotime("Monday"); # wird ein Wochentag angegeben, wird der nächste Tag angenommen, der auf diesen Wochentag fällt
echo date($format, $time)."<br>";
$time = strtotime("next Monday");
echo date($format, $time)."<br>";
$time = strtotime("last Sunday");
echo date($format, $time)."<br>";
$time = strtotime("-1 week");
echo date($format, $time)."<br>";
$time = strtotime("-1 year -2 months -8 days 5 hours 30 minutes 10 seconds"); // negative Werte gehen in die Vergangenheit, positive in die Zukunft
echo date($format, $time)."<br>";
$time = strtotime("-1 week 0:0");
echo date($format, $time)."<br>";
$then = mktime(18, 30, 10, 12, 31, 1999);
$time = strtotime("+1 month last monday", $then); // wird ein zweiter Parameter angegeben, wird dieser als Ausgangszeit angenommen
echo date($format, $time)."<br>";
?>