Unterstützte Datums- und Zeitformate

Dieser Abschnitt beschreibt alle verschiedenen Formate in einem BNF-ähnlichen Format, das der Parser von DateTimeImmutable, DateTime, date_create_immutable(), date_create(), date_parse() und strtotime() versteht. Die Formate sind in Abschnitte gegliedert. In den meisten Fällen können Formate aus verschiedenen Abschnitten durch Leerzeichen, Komma oder Punkt getrennt in derselben Zeichenkette für Datum und Uhrzeit verwendet werden. Für jedes der unterstützten Formate werden ein oder mehrere Beispiele sowie eine Beschreibung des Formats angegeben. Bei Formatzeichen in einfachen Anführungszeichen wird nicht zwischen Groß- und Kleinschreibung unterschieden ('t' könnte t oder T sein), bei Zeichen in doppelten Anführungszeichen wird zwischen Groß- und Kleinschreibung unterschieden ("T" ist nur T).

Die Formatierung von DateTimeImmutable- und DateTime-Objekten wird in der Dokumentation zur Methode DateTimeInterface::format() beschrieben.

Es sollten ein paar allgemeine Regeln beachtet werden.

  1. Der Parser erlaubt für jede Einheit (Jahr, Monat, Tag, Stunde, Minute, Sekunde) die gesamte Bandbreite an Werten. Für ein Jahr sind das einfach 4 Ziffern, für einen Monat ist es 0-12, für einen Tag 0-31, für Stunden 0-24 und für Minuten 0-59.
  2. Weil es Datumsangaben gibt, die eine Schaltsekunde enthalten, ist bei Sekunden die 60 erlaubt. PHP implementiert jedoch die Unix-Zeit, bei der "60" keine gültige Sekundenzahl ist, sodass es zu einem Überlauf kommt.
  3. Wenn eine Zahl außerhalb des zulässigen Bereichs liegt, gibt strtotime() false zurück, und DateTimeImmutable::__construct() löst eine Ausnahme aus.
  4. Wenn eine Zeichenkette ein Datum enthält, werden alle Zeitelemente auf 0 zurückgesetzt.
  5. Wenn irgendein Teil einer Zeit in der angegebenen Zeichenkette vorhanden ist, werden alle kleineren Zeitelemente auf 0 zurückgesetzt.
  6. Um den Parser schneller (und universeller) zu machen, führt er keinerlei Prüfungen durch.
  7. Neben den Regeln für einzelne Zeitelemente versteht der Parser auch spezifischere zusammengesetzte Formate, so kann er z. B. Unix-Zeitstempel (@1690388256) und ISO-Wochentage (2008-W28-3) auswerten.
  8. Es gibt eine Möglichkeit, zu prüfen, ob ein ungültiges Datum oder eine ungültige Uhrzeit angegeben wurde:

    <?php
    $res
    = date_parse("2015-09-31");
    var_dump($res["warnings"]);
    ?>

    Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    array(1) {
      [11] =>
      string(27) "The parsed date was invalid"
    }
    

  9. Es ist bereits möglich, die Grenzfälle zu berücksichtigen, aber dafür muss DateTimeImmutable::createFromFormat() mit dem korrekten Format verwendet werden.

    <?php
    $res
    = DateTimeImmutable::createFromFormat("Y-m-d", "2015-09-34");
    var_dump($res);

    Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    object(DateTimeImmutable)#1 (3) {
      ["date"]=>
      string(26) "2015-10-04 17:24:43.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(13) "Europe/London"
    }
    

Zeitformate

Diese Seite beschreibt die verschiedenen Zeitformate in einem BNF-ähnlichen Format, das der Parser von DateTimeImmutable, DateTime, date_create(), date_create_immutable() und strtotime() versteht.

Die Formatierung von DateTimeImmutable- und DateTime-Objekten wird in der Dokumentation zur Methode DateTimeInterface::format() beschrieben.

Verwendete Symbole
Beschreibung Formate Beispiele
frac (Bruchteil) . [0-9]+ ".21342", ".85"
hh (Stunden im 12-Stunden-Format) "0"?[1-9] | "1"[0-2] "04", "7", "12"
HH (Stunden im 24-Stunden-Format) [01][0-9] | "2"[0-4] "04", "07", "19"
meridian (a.m.=vormittags oder p.m.=nachmittags) [AaPp] .? [Mm] .? [\0\t ] "A.m.", "pM", "am."
MM (Minuten; mit vorangestellter Null) [0-5][0-9] "00", "12", "59"
II (Sekunden; mit vorangestellter Null) [0-5][0-9] "00", "12", "59"
space (Leer- und Tabulatorzeichen) [ \t]  
tz (Zeitzone) "("? [A-Za-z]{1,6} ")"? | [A-Z][a-z]+([_/][A-Z][a-z]+)+ "CEST", "Europe/Amsterdam", "America/Indiana/Knox"
tzcorrection (Zeitverschiebung) "GMT"? [+-] hh ":"? MM? "+0400", "GMT-07:00", "-07:00"
12-Stunden-Schreibweise
Beschreibung Format Beispiele
Nur die Stunde mit Meridian hh space? meridian "4 am", "5PM"
Stunde und Minuten; mit Meridian hh [.:] MM space? meridian "4:08 am", "7:19P.M."
Stunde, Minuten und Sekunden; mit Meridian hh [.:] MM [.:] II space? meridian "4:08:37 am", "7:19:19P.M."
MS SQL (Stunde, Minuten, Sekunden und Bruchteil; mit Meridian) hh ":" MM ":" II [.:] [0-9]+ meridian "4:08:39:12313am"
24-Stunden-Schreibweise
Beschreibung Format Beispiele
Stunde und Minuten 't'? HH [.:] MM "04:08", "19.19", "T23:43"
Stunde und Minuten; ohne Doppelpunkt 't'? HH MM "0408", "t1919", "T2343"
Stunde, Minuten und Sekunden 't'? HH [.:] MM [.:] II "04.08.37", "t19:19:19"
Stunde, Minuten und Sekunden; ohne Doppelpunkt 't'? HH MM II "040837", "T191919"
Stunde, Minuten, Sekunden und Zeitzone 't'? HH [.:] MM [.:] II space? ( tzcorrection | tz ) "040837CEST", "T191919-0700"
Stunde, Minuten, Sekunden und Bruchteil 't'? HH [.:] MM [.:] II frac "04.08.37.81412", "19:19:19.532453"
Informationen über die Zeitzone tz | tzcorrection "CEST", "Europe/Amsterdam", "+0430", "GMT-06:00"

Datumsformate

Diese Seite beschreibt die verschiedenen Datumsformate in einem BNF-ähnlichen Format, das der Parser von DateTimeImmutable, DateTime, date_create(), date_create_immutable() und strtotime() versteht.

Die Formatierung von DateTimeImmutable- und DateTime-Objekten wird in der Dokumentation zur Methode DateTimeInterface::format() beschrieben.

Verwendete Symbole
Beschreibung Format Beispiele
daysuf (Suffix für einen Tag des Monats) "st" | "nd" | "rd" | "th"  
dd (Tag des Monats; ohne vorangestellte Null) ([0-2]?[0-9] | "3"[01]) daysuf? "7th", "22nd", "31"
DD (Tag des Monats; zwei Ziffern mit vorangestellter Null) "0" [0-9] | [1-2][0-9] | "3" [01] "07", "31"
m (vollständiger oder abgekürzter Monatsname) 'january' | 'february' | 'march' | 'april' | 'may' | 'june' | 'july' | 'august' | 'september' | 'october' | 'november' | 'december' | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | "I" | "II" | "III" | "IV" | "V" | "VI" | "VII" | "VIII" | "IX" | "X" | "XI" | "XII"  
M (Monatskürzel) 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec'  
mm (Nummer des Monats) "0"? [0-9] | "1"[0-2] "0", "04", "7", "12"
MM (Nummer des Monats; mit vorangestellter Null) "0" [0-9] | "1"[0-2] "00", "04", "07", "12"
y (Jahr) [0-9]{1,4} "00", "78", "08", "8", "2008"
yy (Jahr; zwei Ziffern) [0-9]{2} "00", "08", "78"
YY (Jahr; vier Ziffern) [0-9]{4} "2000", "2008", "1978"
YYY (Jahr; erweitert, 5-19 Ziffern) [0-9]{5,19} "81412", "20192"
Lokalisierte Schreibweisen
Beschreibung Format Beispiele
Monat und Tag; amerikanische Schreibweise mm "/" dd "5/12", "10/27"
Monat, Tag und Jahr; amerikanische Schreibweise mm "/" dd "/" y "12/22/78", "1/17/2006", "1/17/6"
Jahr (vier Ziffern), Monat und Tag; getrennt durch Schrägstriche YY "/" mm "/" dd "2008/6/30", "1978/12/22"
Jahr (vier Ziffern) und Monat (GNU) YY "-" mm "2008-6", "2008-06", "1978-12"
Jahr, Monat und Tag; getrennt durch Bindestriche y "-" mm "-" dd "2008-6-30", "78-12-22", "8-6-21"
Tag, Monat und Jahr (vier Ziffern); getrennt durch Punkte, Tabulatorzeichen oder Bindestriche dd [.\t-] mm [.-] YY "30-6-2008", "22.12.1978"
Tag, Monat und Jahr (zwei Ziffern); getrennt durch Punkte oder Tabulatorzeichen dd [.\t] mm "." yy "30.6.08", "22\t12.78"
Tag, Monat (textuell) und Jahr dd ([ \t.-])* m ([ \t.-])* y "30-June 2008", "22DEC78", "14 III 1879"
Monat (textuell) und Jahr (vier Ziffern); der Tag wird auf den 1. zurückgesetzt m ([ \t.-])* YY "June 2008", "DEC1978", "March 1879"
Jahr (vier Ziffern) und Monat (textuell); der Tag wird auf den 1. zurückgesetzt YY ([ \t.-])* m "2008 June", "1978-XII", "1879.MArCH"
Monat (textuell), Tag und Jahr m ([ .\t-])* dd [,.stndrh\t ]+ y "July 1st, 2008", "April 17, 1790", "May.9,78"
Monat (textuell) und Tag m ([ .\t-])* dd [,.stndrh\t ]* "July 1st,", "Apr 17", "May.9"
Tag und Monat (textuell) dd ([ .\t-])* m "1 July", "17 Apr", "9.May"
Monatskürzel, Tag und Jahr M "-" DD "-" y "May-09-78", "Apr-17-1790"
Jahr, Monatskürzel und Tag y "-" M "-" DD "78-Dec-22", "1814-MAY-17"
Jahr (und zwar nur das Jahr) YY "1978", "2008"
Jahr (erweitert; 5-19 Ziffern mit Vorzeichen) [+-] YYY "-81120", "+20192"
Monat (textuell) (und zwar nur der Monat) m "March", "jun", "DEC"
Schreibweisen nach ISO8601
Beschreibung Format Beispiele
Acht Ziffern für Jahr, Monat und Tag YY MM DD "15810726", "19780417", "18140517"
Jahr (vier Ziffern), Monat und Tag; getrennt durch Schrägstriche YY "/" MM "/" DD "2008/06/30", "1978/12/22"
Jahr (zwei Ziffern), Monat und Tag; getrennt durch Schrägstriche yy "-" MM "-" DD "08-06-30", "78-12-22"
Jahr (vier Ziffern, optional mit Vorzeichen), Monat und Tag [+-]? YY "-" MM "-" DD "-0002-07-26", "+1978-04-17", "1814-05-17"
Jahr (5+ Ziffern mit erforderlichem Vorzeichen), Monat und Tag [+-] YYY "-" MM "-" DD "-81120-02-26", "+20192-04-17"

Hinweis:

Bei den Formaten y und yy werden Jahreszahlen unter 100 auf besondere Weise behandelt. Liegt die Jahreszahl im Bereich 0-69 (einschließlich), wird 2000 addiert, liegt sie im Bereich 70-99 (einschließlich), wird 1900 addiert. Das bedeutet, dass "00-01-01" als "2000-01-01" interpretiert wird.

Hinweis:

Das Format "Tag, Monat und Jahr (zwei Ziffern); getrennt durch Punkte oder Tabulatorzeichen" (dd [.\t] mm ". " yy) funktioniert nur für Jahre im Bereich 61-99 (einschließlich). Außerhalb dieses Bereichs hat das Zeitformat "HH [.:] MM [.:] SS" Vorrang.

Hinweis:

Das Format "Jahr (und zwar nur das Jahr)" funktioniert nur, wenn die Zeitangabe bereits gefunden wurde. Andernfalls werden die vier Ziffern als HH MM interpretiert.

Achtung

Es ist möglich, die Formate dd und DD zu über- oder unterschreiten. Dabei bezeichnet der Tag 0 den letzten Tag des vorherigen Monats, während eine Überschreitung zum nächsten Monat gezählt wird. Somit entspricht "2008-08-00" dem "2008-07-31" und "2008-06-31" dem "2008-07-01" (der Juni hat nur 30 Tage).

Wie aus dem obigen regulären Ausdruck hervorgeht, ist der Wertebereich für den Tag auf 0-31 beschränkt. So ist z. B. "2008-06-32" keine gültige Datumsangabe.

Es ist auch möglich, die Formate mm und MM mit dem Wert 0 zu unterschreiten. Dabei steht der Monat 0 für den Dezember des Vorjahres. Zum Beispiel ist "2008-00-22" gleichbedeutend mit "2007-12-22".

Wenn die beiden vorherigen Fälle kombiniert werden und sowohl der Tag als auch der Monat unterlaufen werden, geschieht Folgendes: "2008-00-00" wird zunächst in "2007-12-00" umgewandelt, das dann in "2007-11-30" umgewandelt wird. Dies geschieht auch mit der Zeichenkette "0000-00-00", die in "-0001-11-30" umgewandelt wird (das Jahr -1 im ISO 8601-Kalender, das dem Jahr 2 vor Christus im proleptischen gregorianischen Kalender entspricht).

Zusammengesetzte Formate

Diese Seite beschreibt die verschiedenen zusammengesetzten Datums- und Zeitformate in einem BNF-ähnlichen Format, das der Parser von DateTimeImmutable, DateTime, date_create(), date_create_immutable() und strtotime() versteht.

Die Formatierung von DateTimeImmutable- und DateTime-Objekten wird in der Dokumentation zur Methode DateTimeInterface::format() beschrieben.

Verwendete Symbole
Beschreibung Formate Beispiele
DD (Tag des Monats; zwei Ziffern mit vorangestellter Null) "0" [0-9] | [1-2][0-9] | "3" [01] "02", "12", "31"
doy (Tag des Jahres; drei Ziffern) "00"[1-9] | "0"[1-9][0-9] | [1-2][0-9][0-9] | "3"[0-5][0-9] | "36"[0-6] "001", "012", "180", "350", "366"
frac (Bruchteil) . [0-9]+ ".21342", ".85"
hh (Stunden im 12-Stunden-Format) "0"?[1-9] | "1"[0-2] "04", "7", "12"
HH (Stunden im 24-Stunden-Format) [01][0-9] | "2"[0-4] "04", "07", "19"
meridian (a.m.=vormittags oder p.m.=nachmittags) [AaPp] .? [Mm] .? [\0\t ] "A.m.", "pM", "am."
ii (Minuten) [0-5]?[0-9] "04", "8", "59"
II (Minuten; mit vorangestellter Null) [0-5][0-9] "04", "08", "59"
M (Monatskürzel) 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec'  
MM (Nummer des Monats; mit vorangestellter Null) [0-1][0-9] "00", "12"
space (Leer- und Tabulatorzeichen) [ \t]  
ss (Sekunden) ([0-5]?[0-9])|60 "04", "8", "59", "60" (Schaltsekunde)
SS (Sekunden; mit vorangestellter Null) [0-5][0-9] "04", "08", "59"
W (Woche des Jahres) "0"[1-9] | [1-4][0-9] | "5"[0-3] "05", "17", "53"
tzcorrection (Zeitverschiebung) "GMT"? [+-] hh ":"? II? "+0400", "GMT-07:00", "-07:00"
YY (Jahr; vier Ziffern) [0-9]{4} "2000", "2008", "1978"
Standardformate
Beschreibung Beispiele
ATOM "2022-06-02T16:58:35+00:00"
COOKIE "Thursday, 02-Jun-2022 16:58:35 UTC"
ISO8601 "2022-06-02T16:58:35+0000"
» RFC 822 "Thu, 02 Jun 22 16:58:35 +0000"
» RFC 850 "Thursday, 02-Jun-22 16:58:35 UTC"
» RFC 1036 "Thu, 02 Jun 22 16:58:35 +0000"
» RFC 1123 "Thu, 02 Jun 2022 16:58:35 +0000"
» RFC 2822 "Thu, 02 Jun 2022 16:58:35 +0000"
» RFC 3339 "2022-06-02T16:58:35+00:00"
» RFC 3339 Erweitert "2022-06-02T16:58:35.698+00:00"
» RFC 7231 "Thu, 02 Jun 2022 16:58:35 GMT"
RSS "Thu, 02 Jun 2022 16:58:35 +0000"
W3C "2022-06-02T16:58:35+00:00"
Lokalisierte Schreibweisen
Beschreibung Format Beispiele
Gebräuchliches Protokollformat dd "/" M "/" YY : HH ":" II ":" SS space tzcorrection "10/Oct/2000:13:55:36 -0700"
EXIF YY ":" MM ":" DD " " HH ":" II ":" SS "2008:08:07 18:11:31"
ISO-Jahr mit ISO-Woche YY "-"? "W" W "2008W27", "2008-W28"
ISO-Jahr mit ISO-Woche und -Tag YY "-"? "W" W "-"? [0-7] "2008W273", "2008-W28-3"
MySQL YY "-" MM "-" DD " " HH ":" II ":" SS "2008-08-07 18:11:31"
PostgreSQL: Jahr mit Tag des Jahres YY "."? doy "2008.197", "2008197"
SOAP YY "-" MM "-" DD "T" HH ":" II ":" SS frac tzcorrection? "2008-07-01T22:35:17.02", "2008-07-01T22:35:17.03+08:00"
Unix-Zeitstempel "@" "-"? [0-9]+ "@1215282385"
Unix-Zeitstempel mit Mikrosekunden "@" "-"? [0-9]+ "." [0-9]{0,6} "@1607974647.503686"
XMLRPC YY MM DD "T" hh ":" II ":" SS "20080701T22:38:07", "20080701T9:38:07"
XMLRPC (kompakt) YY MM DD 't' hh II SS "20080701t223807", "20080701T093807"
WDDX YY "-" mm "-" dd "T" hh ":" ii ":" ss "2008-7-1T9:3:37"

Hinweis:

Beim "W" in den Formaten "ISO-Jahr mit ISO-Woche" und "ISO-Jahr mit ISO-Woche und -Tag" wird zwischen Groß- und Kleinschreibung unterschieden, d. h. es darf nur ein großes "W" verwendet werden.

Beim "T" in den Formaten SOAP, XMLRPC und WDDX wird zwischen Groß- und Kleinschreibung unterschieden, d. h. es darf nur ein großes "T" verwendet werden.

Das Format "Unix-Zeitstempel" setzt die Zeitzone auf UTC.

Relative Formate

Diese Seite beschreibt die verschiedenen relativen Datums- und Zeitformate in einem BNF-ähnlichen Format, das der Parser von DateTimeImmutable, DateTime, date_create(), date_create_immutable() und strtotime() versteht.

Die Formatierung von DateTimeImmutable- und DateTime-Objekten wird in der Dokumentation zur Methode DateTimeInterface::format() beschrieben.

Verwendete Symbole
Beschreibung Format
dayname (Name eines Tages) 'sunday' | 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
daytext (Intervalle in Wochen) 'weekday' | 'weekdays'
number [+-]?[0-9]+
ordinal (Ordnungszahlen und Indizes) 'first' | 'second' | 'third' | 'fourth' | 'fifth' | 'sixth' | 'seventh' | 'eighth' | 'ninth' | 'tenth' | 'eleventh' | 'twelfth' | 'next' | 'last' | 'previous' | 'this'
reltext (Zeiger) 'next' | 'last' | 'previous' | 'this'
space (Leer- und Tabulatorzeichen) [ \t]+
unit (Intervalle) 'ms' | 'µs' | (( 'msec' | 'millisecond' | 'µsec' | 'microsecond' | 'usec' | 'sec' | 'second' | 'min' | 'minute' | 'hour' | 'day' | 'fortnight' | 'forthnight' | 'month' | 'year') 's'?) | 'weeks' | daytext
Tagesbezogene Schreibweisen
Format Beschreibung Beispiele
'yesterday' Mitternacht von gestern "yesterday 14:00"
'midnight' Die Zeit wird auf 00:00:00 gesetzt  
'today' Die Zeit wird auf 00:00:00 gesetzt  
'now' Jetzt - dies wird einfach ignoriert  
'noon' Die Zeit wird auf 12:00:00 gesetzt "yesterday noon"
'tomorrow' Mitternacht von morgen  
'back of' hour 15 Minuten nach der angegebenen Stunde "back of 7pm", "back of 15"
'front of' hour 15 Minuten vor der angegebenen Stunde "front of 5am", "front of 23"
'first day of' Wird auf den ersten Tag des aktuellen Monats gesetzt. Da dies nur den aktuellen Monat betrifft, ist es in der Regel am besten, dieses Format gefolgt vom Namen des Monats zu verwenden. "first day of January 2008"
'last day of' Wird auf den letzten Tag des aktuellen Monats gesetzt. Da dies nur den aktuellen Monat betrifft, ist es in der Regel am besten, dieses Format gefolgt vom Namen des Monats zu verwenden. "last day of next month"
ordinal space dayname space 'of' Berechnet den x-ten Wochentag des aktuellen Monats. "first sat of July 2008"
'last' space dayname space 'of' Berechnet den letzten Wochentag des aktuellen Monats. "last sat of July 2008"
number space? (unit | 'week') Verarbeitet relative Zeitelemente, deren Wert eine Zahl ist. "+5 weeks", "12 day", "-7 weekdays"
ordinal space unit Verarbeitet relative Zeitelemente, deren Wert ein Text ist. last und previous entsprechen -1, this entspricht nichts, und next entspricht +1. "fifth day", "second month", "last day", "previous year"
'ago' Kehrt alle Werte der zuvor gefundenen relativen Zeitpunkte um. "2 days ago", "8 days ago 14:00", "2 months 5 days ago", "2 months ago 5 days", "2 days ago"
dayname Springt zum nächsten Tag mit diesem Namen (siehe Hinweis). "Monday"
reltext space 'week' Verarbeitet das spezielle Format "Wochentag + letzte/diese/nächste Woche". "Monday next week"

Hinweis:

Relative Angaben werden immer nach nicht-relativen Angaben verarbeitet. Das bedeutet, dass "+1 week july 2008" und "july 2008 +1 week" gleichwertig sind.

Ausnahmen von dieser Regel sind: "yesterday", "midnight", "today", "noon" und "tomorrow". Zu beachten ist, dass sich "tomorrow 11:00" und "11:00 tomorrow" unterscheiden. Angenommen, das heutige Datum ist "23. Juli 2008", dann gibt die erste Variante "2008-07-24 11:00" zurück, während die zweite Variante "2008-07-24 00:00" zurückgibt. Der Grund für dieses Verhalten ist, dass sich diese fünf Ausdrücke direkt auf die aktuelle Zeit auswirken.

Schlüsselwörter wie "first day of" hängen vom Zusammenhang ab, in dem die relative Formatierung verwendet wird. Wenn sie in einer statischen Methode oder Funktion verwendet wird, ist der Referenzpunkt der aktuelle Zeitstempel des Systems. Wenn sie jedoch in DateTime::modify() oder DateTimeImmutable::modify() verwendet wird, bezieht sie sich auf das Objekt, für das die Methode modify() aufgerufen wird.

Hinweis:

Wenn der in der Zeichenkette für Datum und Uhrzeit verwendete Wochentag mit dem aktuellen Wochentag übereinstimmt, sind die folgenden Hinweise zu beachten. Der aktuelle Wochentag kann auch aus nicht-relativen Teilen der Zeichenkette (neu) berechnet worden sein.

  1. "dayname" rückt nicht auf einen anderen Tag vor (Beispiel: "Wed July 23rd, 2008" bedeutet "2008-07-23").
  2. "number dayname" rückt nicht auf einen anderen Tag vor (Beispiel: "1 wednesday july 23rd, 2008" bedeutet "2008-07-23").
  3. "number week dayname" fügt zuerst die Anzahl der Wochen hinzu, rückt aber nicht auf einen anderen Tag vor. In diesem Fall sind "number week" und "dayname" zwei getrennte Blöcke (Beispiel: "+1 week wednesday july 23rd, 2008" bedeutet "2008-07-30").
  4. "ordinal dayname" rückt auf einen anderen Tag vor (Beispiel "first wednesday july 23rd, 2008" bedeutet "2008-07-30").
  5. "number week ordinal dayname" fügt zuerst die Anzahl der Wochen hinzu und rückt dann auf einen anderen Tag vor. In diesem Fall sind "number week" und "ordinal dayname" zwei getrennte Blöcke (Beispiel: "+1 week first wednesday july 23rd, 2008" bedeutet "2008-08-06").
  6. "ordinal dayname 'of' " rückt nicht auf einen anderen Tag vor (Beispiel: "first wednesday of july 23rd, 2008" bedeutet "2008-07-02", weil die spezifische Formulierung mit 'of' den Tag des Monats auf '1' zurücksetzt und das "23rd" hier ignoriert wird).

Zu beachten ist auch, dass das "of" in "ordinal space dayname space 'of' " und "'last' space dayname space 'of' " etwas Besonderes bewirkt.

  1. Es setzt den Tag des Monats auf 1.
  2. "ordinal dayname 'of' " rückt nicht auf einen anderen Tag vor (Beispiel: "first tuesday of july 2008" bedeutet "2008-07-01").
  3. "ordinal dayname " rückt nicht auf einen anderen Tag vor (Beispiel: "first tuesday july 2008" bedeutet "2008-07-08", siehe auch Punkt 4 in obiger Liste).
  4. "'last' dayname 'of' " gibt den letzten dayname des aktuellen Monats zurück (Beispiel: "last wed of july 2008" bedeutet "2008-07-30")
  5. "'last' dayname" gibt den letzten dayname vor dem aktuellen Tag zurück (Beispiel: "last wed july 2008" bedeutet "2008-06-25"; "july 2008" setzt zuerst das aktuelle Datum auf "2008-07-01" und mit "last wed" verschiebt sich das Datum auf den vorherigen Mittwoch, d. h. auf den "2008-06-25").

Hinweis:

Relative Monatswerte werden auf der Grundlage der Länge der Monate berechnet, die sie durchlaufen. Ein Beispiel wäre "+2 month 2011-11-30", was "2012-01-30" ergeben würde. Das liegt daran, dass der November 30 Tage hat und der Dezember 31 Tage, was insgesamt 61 Tage ergibt.

Hinweis:

number ist eine ganzzahlige Zahl; wenn eine Dezimalzahl angegeben wird, wird der Punkt (oder das Komma) in der Regel als Begrenzungszeichen interpretiert. Zum Beispiel wird '+1.5 hours' als '+1 5 hours' interpretiert und nicht als '+1 hour +30 minutes'.

Changelog

Version Beschreibung
8.2.0 number akzeptiert keine mehrfachen Vorzeichen mehr, z. B. +-2.
7.0.8 Wochen beginnen immer am Montag. Bisher galt auch der Sonntag als Wochenbeginn.

add a note

User Contributed Notes 2 notes

up
2
Anonymous
1 month ago
The year-only format is a potential issue that could cause problems for you.

<?php
echo (new DateTime('1994'))->format('Y-m-d');
// Outputs today's date in the year 1984, e.g. "1994-08-15"
echo (new DateTime('2004'))->format('Y-m-d');
// Outputs today's date in the *current* year, e.g. "2024-08-15"
?>

This is because, as noted above in the documentation, 2004 gets interpreted as a time, e.g. 20:04, rather than as a year. Even though 1994 is interpreted as a year.

One solution is to add ' T' to the end of the string:

<?php
echo (new DateTime('1994 T'))->format('Y-m-d');
// "1994-08-15"
echo (new DateTime('2004 T'))->format('Y-m-d');
// "2004-08-15"
?>

Another would be to add an arbitrary time to the beginning of the string:

<?php
echo (new DateTime('11:00 1994'))->format('Y-m-d');
// "1994-08-15"
echo (new DateTime('11:00 2004'))->format('Y-m-d');
// "2004-08-15"
?>
up
1
Anonymous
15 days ago
I wrote previously that appending a 'T' to a year forces PHP to interpret the date as a year rather than a time. This does not appear to be universally true. While this method did work for me in my previous development environment (PHP 8.1 on Ubuntu 20.04), it does not work after upgrading my development environment (PHP 8.3 on Ubuntu 24.04). The 'T' is instead seen as a timezone.

Further testing shows that PHP 8.1 (and even earlier PHP versions) also have this new behavior I am observing. Therefore, I can only assume the behavior is dependent on environment and/or build rather than PHP version.

The suggestion about adding an actual time string to the year, e.g. '00:00 2004', is still valid. This appears to be the only reliable way to force PHP to interpret a string as a date rather than a datetime.
To Top