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.
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";
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:
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 |
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
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
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 ([ 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:
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
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
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>");
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
Hinterlasse mir gerne einen Kommentar zum Artikel und wie er dir weitergeholfen hat beziehungsweise, was dir helfen würde das Thema besser zu verstehen. Oder hast du einen Fehler entdeckt, den ich korrigieren sollte? Schreibe mir auch dazu gerne ein Feedback!
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? "!