W3docs

mktime()

PHP mktime(): Argumentreihenfolge, automatische Datumsnormalisierung, Zeitzonenverhalten und sicheres Rechnen mit Datumsangaben.

Die PHP-Funktion mktime() erstellt einen Unix-Timestamp aus einzelnen Datums- und Zeitbestandteilen — Stunde, Minute, Sekunde, Monat, Tag und Jahr. Sie ist das Gegenstück zu date(): Während date() einen Timestamp in einen formatierten String umwandelt, wandelt mktime() die Teile eines Datums in einen Timestamp um, den man speichern, vergleichen oder für Berechnungen verwenden kann.

Dieses Kapitel behandelt die Argumentreihenfolge (die fast alle verwirrt), wie mktime() ungültige Werte automatisch normalisiert, das Zeitzonenverhalten und wann man stattdessen die DateTime-Klassen verwenden sollte.

Syntax

mktime(
    int $hour = (current hour),
    ?int $minute = (current minute),
    ?int $second = (current second),
    ?int $month  = (current month),
    ?int $day    = (current day),
    ?int $year   = (current year)
): int|false

Das erste Argument, $hour, ist seit PHP 8.0 erforderlich — ein Aufruf von mktime() ohne Argumente wirft einen ArgumentCountError. Jedes ausgelassene Argument wird standardmäßig auf den entsprechenden Teil des aktuellen lokalen Datums und der aktuellen Uhrzeit gesetzt. Die Funktion gibt den Timestamp als Integer zurück oder false, wenn die Argumente ein Datum außerhalb des gültigen Bereichs erzeugen.

Ein Unix-Timestamp ist die Anzahl der Sekunden, die seit der Unix-Epoche — dem 1. Januar 1970, 00:00:00 UTC — vergangen sind. Er ist die gemeinsame Währung für Datumsangaben in PHP, Datenbanken und Betriebssystemen.

Auf die Argumentreihenfolge achten. mktime() erwartet die Zeit vor dem Datum: hour, minute, second, month, day, year. Das unterscheidet sich von der üblichen Schreibweise (Jahr-Monat-Tag) und ist daher die häufigste Fehlerquelle.

Einen bestimmten Timestamp erstellen

Um einen festen Zeitpunkt darzustellen, übergibt man alle sechs Teile. Hier wird 14:30 Uhr am 15. Juni 2024 erstellt:

php— editable, runs on the server

Die Zeitzone wird explizit gesetzt, damit die Ausgabe reproduzierbar ist. Ohne date_default_timezone_set() interpretiert mktime() die Teile in der konfigurierten Zeitzone des Servers, was den resultierenden Timestamp verschieben kann.

Datumsberechnungen mit mktime()

Da ein Timestamp lediglich eine Anzahl von Sekunden ist, kann man Sekunden addieren oder subtrahieren, um ein Datum vor- oder zurückzusetzen. Um das Datum 30 Tage nach einem bestimmten Tag zu ermitteln, addiert man 30 × 86400 Sekunden (ein Tag hat 86.400 Sekunden):

30 Tage zu einem Datum addieren

php— editable, runs on the server

Dieser Ansatz mit rohen Sekunden funktioniert gut für ganze Tage, ignoriert jedoch Sommerzeit-Übergänge: Ein „Tag" ist nicht immer genau 86.400 Sekunden lang. Für korrekte Kalenderberechnungen über Sommerzeit-Grenzen hinweg sollte man stattdessen DateTime::modify() oder DateInterval verwenden.

Automatische Normalisierung

Eine praktische Eigenschaft von mktime() ist, dass es ungültige Werte normalisiert: Es rechnet diese in das korrekte Datum um, anstatt einen Fehler zu erzeugen. Übergibt man Monat 13, erhält man den Januar des nächsten Jahres; übergibt man Tag 0, erhält man den letzten Tag des Vormonats:

php— editable, runs on the server

Dadurch ist mktime() praktisch für Berechnungen wie „letzter Tag dieses Monats": mktime(0, 0, 0, $month + 1, 0, $year) ergibt den letzten Tag von $month. Diese Nachsicht bedeutet jedoch auch, dass mktime() ein eindeutig ungültiges Datum wie den 30. Februar nicht ablehnt — es rechnet es stillschweigend um. Wenn ein Kalenderdatum validiert werden soll, sollte man zuerst checkdate() verwenden.

Häufige Fallstricke

  • Falsche Argumentreihenfolge. mktime(2024, 6, 15) in der Annahme, es sei Jahr-Monat-Tag, erzeugt ein unsinniges Datum. Zur Erinnerung: erst die Zeit, dann Monat, Tag, Jahr.
  • Keine Argumente in PHP 8. mktime() ohne Argumente wirft einen ArgumentCountError. Um den aktuellen Timestamp zu erhalten, verwendet man stattdessen time().
  • Zweistellige Jahreszahlen. Es sollte immer eine vierstellige Jahreszahl übergeben werden. Werte wie 069 werden auf 2000–2069 abgebildet und 70100 auf 1970–2000, was selten gewünscht ist.

mktime() vs. die DateTime-Klassen

mktime() ist prozedural und arbeitet in der lokalen Zeitzone. Für UTC-Teile verwendet man das Geschwister gmmktime(). Für neuen Code sollte man die objektorientierte Klassen DateTime und DateTimeImmutable bevorzugen — sie enthalten Zeitzoneninformationen, verarbeiten sommerzeit-bewusste Berechnungen und vermeiden manuelle Sekundenrechnungen:

php— editable, runs on the server

Fazit

mktime() erstellt einen Unix-Timestamp aus Datums- und Zeitteilen und normalisiert dabei automatisch ungültige Werte — was es praktisch für schnelle Datumsberechnungen und „letzter Tag des Monats"-Tricks macht. Die Besonderheiten sollte man im Hinterkopf behalten: Die Zeit kommt in der Argumentliste vor dem Datum, und ein Aufruf ohne Argumente führt jetzt zu einem Fehler (für „jetzt" verwendet man time()). Für sommerzeit-korrekte, zeitzonenbewusste Arbeit in modernem PHP sollte man auf DateTimeImmutable und DateInterval zurückgreifen. Siehe auch checkdate() für die Validierung und strtotime() für das Parsen von menschenlesbaren Datumsstrings.

Übungen

Übung
Was macht die PHP-Funktion mktime()?
Was macht die PHP-Funktion mktime()?
Was this page helpful?