Lerne Coding
Zeit und Datum in PHP - Wie gehst du damit richtig um?
26.09.2020

Wichtige Zeit- und Datums-Funktionen in PHP

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. Minuten

Gerade bei Auswertungen, Buchungen oder Logs werden immer wieder Datumswerte gebraucht, doch einige scheinen das System dahinter noch nicht so ganz verstanden zu haben. Deswegen erkläre ich dir nun wie man mit Zeit und Datum richtig arbeitet.

Was ist der Unix-Timestamp

Der Unix-Timestamp ist eine Zahl, welche vom 01.01.1970 00:00:00 sekündlich hochgezählt wird und anhand derer sich das aktuelle Datum berrechnen lässt. Zum Beispiel: der aktuelle Timestamp (an dem dieser Absatz geschrieben wurde) ist 1595422880. Auf der Seite "Unix Timestamp" kannst du dir den aktuellen Timestamp anzeigen lassen. In PHP kann man sich diesen mit time() ausgeben lassen. Als Rückgabewert bekommen wir eine Ganzzahl mit der wir auch rechnen können:

echo "Jetzt sind ".time()." Sekunden seit dem 01.01.1970 vergangen";
echo "Vor 100 Sekunden waren es noch ".(time() - 100)." Sekunden";

Die Date() Funktion

Mit ihr kann man mit dem aktuellen (default) oder mit einem eigenen Timestamp die entsprechende Zeit errechnen und sie in ein gewünschtes Format bringen. Hier findest du eine Tabelle mit allen wichtigen Datumsformaten:

Thema der Tabelle "Zeit/Datums Formate "
Name Beschreibung Beispiel
Uhrzeit
H Stunde (24 Stunden Format mit führender Null) 18
h Stunde (12 Stunden Format mit führender Null) 6
i Minute (mit führender Null) 54
s Sekunde (mit führender Null) 42
a Ante meridiem und Post meridiem (Kleinbuchstaben) am / pm
A Ante meridiem und Post meridiem (Großbuchstaben) AM / PM
I (großes i) Liegt das Datum in der Sommerzeit (1 = ja, 0 = nein) 1
Datum
d Tag (mit führender Null) 04
m Monat (mit führender Null) 07
Y Jahr (vierstellig) 2020
y Jahr (zweistellig) 20
N Wochentag als Zahl (1-7) 1
L Schaltjahr (1 = ja, 0 = nein) 0
Woche
W Kalenderwoche 42
Namen
l (kleines L) Wochentag (Englisch) Monday, Tuesday,...
d Wochentag kurz (Englisch) Mon, Tue,...
F Monatsname (Englisch) January,....
M Monatesname kurz (Englisch) Jan, Feb,...
Sonstiges
r nach RFC 2822 formatiertes Datum (international lesbar) Thu, 21 Dec 2000 16:01:07 +0200
U Unix Timestamp (vergleichbar mit time() Funktion) 1595422880

Daten formatieren

Aus der PHP-Dokumentation finden wir folgende Informationen über die Date-Funktion:

date ( string $format [, int $timestamp = time() ] ) : string

Die Funktion date() nimmt als ersten Parameter einen String, welcher das Datumsformat angeben soll und optional noch eine Ganzzahl. Diese Ganzzahl, ein Unix-Timestamp, ist optional und wird, falls er nicht angegeben wird, durch den aktuellen Timestamp ersetzt. Diese Funktion gibt uns anschließend einen String, also eine alphanumerische Zeichenkette (Text), zurück.

Stell dir vor du erstellst gerade einen Log und möchtest die Datumswerte lesbar in ein einheitliches Format mit führenden Nullen bringen. Das bedeutet in einfacher Sprache du möchtest so etwas:

09.07.2015 02:30:34 Aktion
22.10.2015 12:54:42 Aktion
12.12.2015 15:06:13 Aktion

Nun wirfst du einen Blick in die Tabelle und erlangst folgende Kenntniss: Tag = d, Monat = m, Jahr = Y, Stunde = H, Minute = i und Sekunde = s. Das Datum soll mit . getrennt werden und die Uhrzeit mit einem :. Diese Informationen musst du der Funktion nur noch als Text übermitteln. Alle Zeichen die nicht in der Tabelle stehen, werden normal ausgegeben (z. B. Leer- und Sonderzeichen)

 echo date("d.m.Y H:i:s"); // output: 01.01.2020 09:00:00

Monat oder Wochentag in PHP auf Deutsch Ausgeben

Wenn du dir den Monat oder den Wochentag auf Deutsch ausgeben möchtest, musst du eine andere Zeitzone einstellen. Unter Linux (dein Webspace läuft vermutlich mit Linux) benötigt man den Befehl:

setlocale(LC_TIME, 'de_DE', 'de_DE.UTF-8');

Solltest du unter Xampp entwickeln oder auf einem Windows-Server hosten, benötigst du diese Zeile:

setlocale(LC_TIME, 'deu');

Du kannst aber auch beide problemlos untereinander schreiben. Windows hat da einfach einen anderen Standard als Unix gewählt, dieses Detail vermisst man auf vielen Webseiten im Internet. Nun sind die Monate und Wochentage auch in Deutsch verfügbar:

echo strftime("%A, %d. %B %Y");
// output: Donnerstag, 13. August 2020

Falls du auch andere Länder unterstützt, schau dir gerne die Microsoft-Dokumentationen zu den jeweiligen Sprach- und Ländercodes an

Zeitreisen in PHP

Ein Problem auf das du nun stoßen könntest wäre, dass du ein Datum aus der Vergangenheit oder Zukunft speichern und später formatieren möchtest. Nun kommen zum einen die time() Funktion als auch der optionale Timestamp-Parameter der Date Funktion zum Einsatz. Sagen wir du möchtest ermitteln welcher Wochentag gestern war, dann könntest du den aktuellen Timestamp minus die Sekunden die ein Tag hat (86400s) rechnen:

echo date("l", time() - 86400); // heute ist Donnerstag, also => "Wednesday"

Das ganze würde auf die Praxis bezogen bedeuten, wir ermitteln den Timestamp anhand eines Datums. Dafür bietet PHP zwei Funktionen: mktime und strtotime. Mktime nimmt die einzelnen Werte als Zahl und strtotime versucht anhand eines Strings das Datum zu ermitteln. Solange du dich da an Standards hältst schafft die Funktion das auch, sollte sie scheitern gibt sie false zurück. 32-Bit Betriebssysteme (fast ausschließlich nur bei alten PCs zu finden) haben aufgrund der Speichergrößen eingeschränkte Datumsbereiche und sind damit Fehleranfälliger. Falls du dich dafür interessierst und mehr dazu wissen möchtest, kannst du dich mit dem Binär-System auseinandersetzen. Dann verstehst du, weshalb der Computer dabei an Grenzen stößt.

Mktime

mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] ) : int

Die mktime-Funktion nimmt ausschließlich Integer (Ganzzahlen) als Parameter. Gibst du keine Werte an, holt sie sich aktuelle. Ein leerer mktime Aufruf ist also vergleichbar mit time(). Die Parameter müssen in folgender Reihenfolge übergeben werden:

  1. Stunde (0-23)
  2. Minute (0-59)
  3. Sekunde (0-59)
  4. Monat (1-12)
  5. Tag (1-31)
  6. Jahr Zahlen zwischen 0-69 beziehen sich auf 2000 - 2069. Zahlen zwischen 70-100 beziehen sich auf 1970-2000. Ich empfehle dir aber ein vierstelliges Datum zu übergeben wie z.B. 2020.

Sollte die Funktion ungültige Werte bekommen oder den Timestamp nicht errechnen können, gibt sie false zurück.

$stunde  = 0;
$minute  = 0;
$sekunde = 0;

$monat = 1;
$tag   = 1;
$jahr  = 2021;

$timestamp = mktime($stunde, $minute, $sekunde, $monat, $tag, $jahr);
echo "Der \"01.01.2021 00:00:00\" ist ein: ".date("l", $timestamp);
// Output: Der \"01.01.2021 00:00:00\" ist ein: Friday

Strtotime

Diese Funktion hat zwei Verwendungszwecke: zum einen kann man Datumsstrings einlesen, zum anderen kann aber auch über Text ein Timestamp verändert werden.

Fangen wir mit dem Einlesen eines Datums an. Der oben generierte Zeit-String kann problemlos wieder mit dieser Funktion eingelesen werden:

$timestring = date("d.m.Y H:i:s");
echo "String: ".$timestring."\n";
echo "Timestamp: ".strtotime($timestring);

/*
    Ausgabe:
String: 23.07.2020 06:29:36
Timestamp: 1595485776
*/

Wenn du erfahren möchtest, welche Formate strtotime einlesen kann und welche nicht, kannst du diesen Beitrag von PHP.net lesen.

Die andere Funktionalität von strtotime ist ein Datum mit Text zu verändern. So kannst du z.B. den nächsten Donnerstag oder letzten Montag ermitteln, aber auch das Datum in einer Woche, 2 Tagen, 4 Stunden oder 2 Sekunden. Optional kann auch wieder ein Timestamp angegeben werden (wie bei Date). Die relativen Datumsänderungen habe ich mit einem Timestamp versehen, dieser kann auch ein älterer oder neuerer Timestamp sein.

$timestamp = time();
echo strtotime("now");
echo strtotime("10 September 2000");
echo strtotime("+1 day", $timestamp);
echo strtotime("+1 week", $timestamp);
echo strtotime("+1 week 2 days 4 hours 2 seconds", $timestamp);
echo strtotime("next Thursday", $timestamp);
echo strtotime("last Monday", $timestamp);

/*
    Ausgabe:
1595486243 // jetzt
968544000  // 10. September 2000
1595572670 // + 1 Tag
1596091070 // + 1 Woche
1596278272 // +1 Woche, 2 Tage, 4 Stunden und 2 Sekunden
1596067200 // nächster Donnerstag
1595203200 // letzter Montag
*/

Welche Werte du dort übergeben kannst, erfährst du ebenfalls im Beitrag oben

Datum auf Existenz überprüfen

Die Funktion checkdate() überprüft, ob das genannte Datum existiert, oder nicht.

checkdate ( int $month , int $day , int $year ) : bool

Die Funktion nimmt drei Ganzzahlen als Parameter: Monat, Tag, Jahr (in dieser Reihenfolge) und gibt dann je nach Datum true oder false zurück. Sie beachtet auch Regelungen wie Schaltjahre, wodurch das Schreiben einiger eigenen Funktionen obsolet wird.

// lange schreibweise
if (checkdate(12, 30, 2001) === true) { echo "True<br>"; } else { echo "False<br>"; }

// kurze schreibweise
echo ((checkdate(12, 30, 2001) === true) ? "True<br>" : "False<br>");

Alter des Nutzers verifizieren

Gerade wenn man eine Seite baut die sich an Volljährige richtet, ist es wichtig das Alter zu überprüfen. Das Alter könnte man zwar auch mit date_diff ermitteln, aber diese Methode finde ich persönlich schöner weil sie so kompakt ist. Es muss lediglich das Geburtsdatum ersetzt werden und die Funktion gibt das Alter des Nutzers aus.

echo floor((time() - strtotime("01.01.2000"))/31556926); 
// Zeitpunkt Juli 2020 -> 20
Bildquelle - Vielen Dank an die Ersteller:innen für dieses Bild
Kommentare zum Artikel

Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "Zeit und Datum in PHP - Wie gehst du damit richtig um? "!

Kommentar schreiben

Verwante Beiträge
close