1
0
mirror of https://github.com/php/doc-de.git synced 2026-03-24 07:12:15 +01:00
Files
archived-doc-de/reference/datetime/datetimeimmutable/createfromformat.xml
Martin Samesch 794abf929f Sync with EN
2024-06-24 22:01:10 +02:00

865 lines
31 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 3c9bf397b89a2ea8d05385d35a8af5ccccfc5dd5 Maintainer: samesch Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="datetimeimmutable.createfromformat" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<refnamediv>
<refname>DateTimeImmutable::createFromFormat</refname>
<refname>date_create_immutable_from_format</refname>
<refpurpose>Wertet eine Zeitangabe gemäß dem angegebenen Format aus</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<para>&style.oop;</para>
<methodsynopsis role="DateTimeImmutable">
<modifier>public</modifier> <modifier>static</modifier> <type class="union"><type>DateTimeImmutable</type><type>false</type></type><methodname>DateTimeImmutable::createFromFormat</methodname>
<methodparam><type>string</type><parameter>format</parameter></methodparam>
<methodparam><type>string</type><parameter>datetime</parameter></methodparam>
<methodparam choice="opt"><type class="union"><type>DateTimeZone</type><type>null</type></type><parameter>timezone</parameter><initializer>&null;</initializer></methodparam>
</methodsynopsis>
<para>&style.procedural;</para>
<methodsynopsis>
<type class="union"><type>DateTimeImmutable</type><type>false</type></type><methodname>date_create_immutable_from_format</methodname>
<methodparam><type>string</type><parameter>format</parameter></methodparam>
<methodparam><type>string</type><parameter>datetime</parameter></methodparam>
<methodparam choice="opt"><type class="union"><type>DateTimeZone</type><type>null</type></type><parameter>timezone</parameter><initializer>&null;</initializer></methodparam>
</methodsynopsis>
<para>
Gibt ein neues <classname>DateTimeImmutable</classname>-Objekt zurück.
Es stellt das Datum und die Uhrzeit dar, die in der Zeichenkette
<parameter>datetime</parameter> angegeben sind und gemäß dem angegebenen
<parameter>format</parameter> formatiert wurden.
</para>
</refsect1>
<refsect1 role="parameters" xml:id="datetimeimmutable.createfromformat.parameters">
&reftitle.parameters;
<variablelist>
<varlistentry>
<term><parameter>format</parameter></term>
<listitem>
<para>
Das Format, in dem der übergebene <type>&string;</type> sein soll. Siehe
die nachfolgenden Formatierungsoptionen. In den meisten Fällen können
die gleichen Buchstaben verwendet werden wie für die Funktion
<function>date</function>.
</para>
<para>
Alle Felder werden mit den aktuellen Werten für Datum und Uhrzeit
initialisiert. In den meisten Fällen wird man diese auf "Null"
zurücksetzen wollen (die Unix-Epoche, <literal>1970-01-01 00:00:00
UTC</literal>). Dies wird erreicht, indem das Zeichen
<literal>!</literal> als erstes Zeichen in den Parameter
<parameter>format</parameter> eingefügt wird, oder <literal>|</literal>
als letztes Zeichen. Weitere Informationen zu den einzelnen Zeichen sind
in der folgenden Beschreibung zu finden.
</para>
<para>
Das Format wird von links nach rechts ausgewertet, was bedeutet, dass
die Reihenfolge, in der die Formatzeichen angeordnet sind, in manchen
Situationen das Ergebnis beeinflusst. Im Fall von <literal>z</literal>
(der Tag des Jahres) ist es erforderlich, dass bereits ein Jahr
ausgewertet wurde, zum Beispiel durch die Zeichen <literal>Y</literal>
oder <literal>y</literal>.
</para>
<para>
Buchstaben, die für die Auswertung von Zahlen verwendet werden, lassen
eine große Bandbreite von Werten zu, die außerhalb des logischen
Bereichs liegen. Zum Beispiel akzeptiert das <literal>d</literal> (Tag
des Monats) Werte im Bereich von <literal>00</literal> bis
<literal>99</literal>. Die einzige Einschränkung betrifft die Anzahl der
Ziffern. Wenn ein Wert außerhalb des Bereichs angegeben wird, wird der
Überlaufmechanismus des Parsers für Datum und Uhrzeit verwendet. Im
Folgenden sind einige Beispiele für dieses Überlaufverhalten aufgeführt.
</para>
<para>
Das bedeutet auch, dass die Daten, die für einen Formatbuchstaben
ausgewertet werden, gierig sind und so viele Ziffern lesen, wie ihr
Format zulässt. Das kann dann auch bedeuten, dass in der Zeichenkette
<parameter>datetime</parameter> nicht mehr genügend Zeichen für
nachfolgende Formatzeichen vorhanden sind. Ein Beispiel auf dieser Seite
veranschaulicht auch dieses Problem.
</para>
<para>
<table>
<title>
Die folgenden Zeichen werden in der Parameterzeichenkette
<parameter>format</parameter> erkannt
</title>
<tgroup cols="3">
<thead>
<row>
<entry><parameter>format</parameter>-Zeichen</entry>
<entry>Beschreibung</entry>
<entry>Beispiele zulässiger Werte</entry>
</row>
</thead>
<tbody>
<row>
<entry align="center"><emphasis>Tag</emphasis></entry>
<entry>---</entry>
<entry>---</entry>
</row>
<row>
<entry><literal>d</literal> und <literal>j</literal></entry>
<entry>Tag des Monats; zwei Ziffern mit oder ohne vorangestellter Null</entry>
<entry>
<literal>01</literal> bis <literal>31</literal> oder
<literal>1</literal> bis <literal>31</literal> (2-stellige Zahlen,
die höher sind als die Anzahl der Tage im Monat, werden akzeptiert,
führen aber zu einem Überlauf des Monats. Zum Beispiel bedeutet die
33 bei Januar den 2. Februar)
</entry>
</row>
<row>
<entry><literal>D</literal> und <literal>l</literal></entry>
<entry>Textuelle Darstellung eines Tages</entry>
<entry>
<literal>Mon</literal> bis <literal>Sun</literal> oder
<literal>Sonntag</literal> bis <literal>Samstag</literal>. Wenn der
angegebene Tagesname vom ausgewerteten (oder voreingestellten)
Datum abweicht, kommt es zu einem Überlauf bis zum
<emphasis>nächsten</emphasis> Datum mit dem angegebenen Tagesnamen.
Siehe die Beispiele unten für eine Erklärung.
</entry>
</row>
<row>
<entry><literal>S</literal></entry>
<entry>
Englisches Ordnungssuffix für einen Tag des Monats; zwei Buchstaben.
Es wird bei der Auswertung ignoriert.
</entry>
<entry>
<literal>st</literal>, <literal>nd</literal>, <literal>rd</literal>
oder <literal>th</literal>.
</entry>
</row>
<row>
<entry><literal>z</literal></entry>
<entry>
Tag des Jahres (beginnend bei 0); es muss ein <literal>Y</literal>
oder <literal>y</literal> vorangestellt werden.
</entry>
<entry>
<literal>0</literal> bis <literal>365</literal> (es können auch
dreistellige Zahlen angegeben werden, die größer sind als die
Anzahl der Tage in einem Jahr; in diesem Fall wird die Differenz
auf das nächste Jahr übertragen. Zum Beispiel bedeutet 366 in
Verbindung mit 2022 den 2. Januar 2023)
</entry>
</row>
<row>
<entry align="center"><emphasis>Monat</emphasis></entry>
<entry>---</entry>
<entry>---</entry>
</row>
<row>
<entry><literal>F</literal> und <literal>M</literal></entry>
<entry>Textuelle Darstellung eines Monats, &zb; January oder Sept</entry>
<entry>
<literal>January</literal> bis <literal>December</literal> oder
<literal>Jan</literal> bis <literal>Dec</literal>
</entry>
</row>
<row>
<entry><literal>m</literal> und <literal>n</literal></entry>
<entry>
Numerische Darstellung eines Monats; mit oder ohne vorangestellter Null
</entry>
<entry>
<literal>01</literal> bis <literal>12</literal> oder
<literal>1</literal> bis <literal>12</literal> (es können auch
zweistellige Zahlen größer als 12 angegeben werden; in diesem Fall
wird die Differenz auf das nächste Jahr übertragen. Zum Beispiel
bedeutet 13 den Januar des nächsten Jahres)
</entry>
</row>
<row>
<entry align="center"><emphasis>Jahr</emphasis></entry>
<entry>---</entry>
<entry>---</entry>
</row>
<row>
<entry><literal>X</literal> und <literal>x</literal></entry>
<entry>
Vollständige numerische Darstellung einer Jahreszahl; bis zu 19
Ziffern, optional mit vorangestelltem <literal>+</literal> oder
<literal>-</literal>
</entry>
<entry>
Beispiele: <literal>0055</literal>, <literal>787</literal>,
<literal>1999</literal>, <literal>-2003</literal>,
<literal>+10191</literal>
</entry>
</row>
<row>
<entry><literal>Y</literal></entry>
<entry>
Vollständige numerische Darstellung einer Jahreszahl; bis zu vier Ziffern
</entry>
<entry>
Beispiele: <literal>0055</literal>, <literal>787</literal>,
<literal>1999</literal>, <literal>2003</literal>
</entry>
</row>
<row>
<entry><literal>y</literal></entry>
<entry>
Eine zweistellige Jahreszahl (für den Bereich 1970-2069).
</entry>
<entry>
Beispiele: <literal>99</literal> oder <literal>03</literal>
(werden interpretiert als <literal>1999</literal> bzw.
<literal>2003</literal>)
</entry>
</row>
<row>
<entry align="center"><emphasis>Zeit</emphasis></entry>
<entry>---</entry>
<entry>---</entry>
</row>
<row>
<entry><literal>a</literal> und <literal>A</literal></entry>
<entry>Ante meridiem (vor Mittag) und post meridiem (nach Mittag)</entry>
<entry><literal>am</literal> oder <literal>pm</literal></entry>
</row>
<row>
<entry><literal>g</literal> und <literal>h</literal></entry>
<entry>Stunde im 12-Stunden-Format; mit oder ohne vorangestellter Null</entry>
<entry>
<literal>1</literal> bis <literal>12</literal> oder
<literal>01</literal> bis <literal>12</literal> (es können auch
zweistellige Zahlen größer als 12 angegeben werden; in diesem Fall
wird die Differenz auf den nächsten Tag übertragen.
<literal>14</literal> bedeutet zum Beispiel <literal>02</literal>
im nächsten AM/PM-Zeitraum)
</entry>
</row>
<row>
<entry><literal>G</literal> und <literal>H</literal></entry>
<entry>Stunde im 24-Stunden-Format; mit oder ohne vorangestellter Null</entry>
<entry>
<literal>0</literal> bis <literal>23</literal> oder
<literal>00</literal> bis <literal>23</literal> (es können auch
zweistellige Zahlen größer als 24 angegeben werden; in diesem Fall
wird die Differenz auf den nächsten Tag übertragen.
<literal>26</literal> bedeutet zum Beispiel
<literal>02:00</literal> am nächsten Tag)
</entry>
</row>
<row>
<entry><literal>i</literal></entry>
<entry>Minuten; mit vorangestellter Null</entry>
<entry>
<literal>00</literal> to <literal>59</literal> (es können auch
zweistellige Zahlen größer als 59 angegeben werden; in diesem Fall
wird die Differenz auf die nächste Stunde übertragen.
<literal>66</literal> bedeutet zum Beispiel
<literal>:06</literal> in der nächsten Stunde)
</entry>
</row>
<row>
<entry><literal>s</literal></entry>
<entry>Sekunden; mit vorangestellter Null</entry>
<entry>
<literal>00</literal> bis <literal>59</literal> (es können auch
zweistellige Zahlen größer als 59 angegeben werden; in diesem Fall
wird die Differenz auf den nächsten Tag übertragen.
<literal>90</literal> bedeutet zum Beispiel
<literal>:30</literal> in der nächsten Minute)
</entry>
</row>
<row>
<entry><literal>v</literal></entry>
<entry>Bruchteil in Millisekunden (bis zu drei Ziffern)</entry>
<entry>
Beispiel: <literal>12</literal> (<literal>0.12</literal> Sekunden),
<literal>345</literal> (<literal>0.345</literal> Sekunden)
</entry>
</row>
<row>
<entry><literal>u</literal></entry>
<entry>Bruchteil in Mikrosekunden (bis zu sechs Ziffern)</entry>
<entry>
Beispiel: <literal>45</literal> (<literal>0.45</literal> Sekunden),
<literal>654321</literal> (<literal>0.654321</literal> Sekunden)
</entry>
</row>
<row>
<entry align="center"><emphasis>Zeitzone</emphasis></entry>
<entry>---</entry>
<entry>---</entry>
</row>
<row>
<entry>
<literal>e</literal>, <literal>O</literal>, <literal>p</literal>,
<literal>P</literal> und <literal>T</literal>
</entry>
<entry>
Bezeichner der Zeitzone, Differenz zu UTC (in Stunden), Differenz
zu UTC (mit Doppelpunkt zwischen Stunden und Minuten) oder
Zeitzonenkürzel
</entry>
<entry>
Beispiele: <literal>UTC</literal>, <literal>GMT</literal>,
<literal>Atlantic/Azores</literal>,
<literal>+0200</literal>, <literal>+02:00</literal>,
<literal>EST</literal>, <literal>MDT</literal>
</entry>
</row>
<row>
<entry align="center"><emphasis>Datum und Uhrzeit in voller Länge</emphasis></entry>
<entry>---</entry>
<entry>---</entry>
</row>
<row>
<entry><literal>U</literal></entry>
<entry>Sekunden seit der Unix-Epoche (1. Januar 1970 00:00:00 GMT)</entry>
<entry>Beispiel: <literal>1292177455</literal></entry>
</row>
<row>
<entry align="center"><emphasis>Whitespace und Trennzeichen</emphasis></entry>
<entry>---</entry>
<entry>---</entry>
</row>
<row>
<entry><literal> </literal> (Leerraum)</entry>
<entry>
Leerzeichen, Tabulatoren, oder NBSP (U+A0)- oder NNBSP (U+202F)-Zeichen
</entry>
<entry>Beispiele: <literal>"\t"</literal>, <literal>" "</literal></entry>
</row>
<row>
<entry><literal>#</literal></entry>
<entry>
Eins der folgenden Trennzeichen: <literal>;</literal>,
<literal>:</literal>, <literal>/</literal>, <literal>.</literal>,
<literal>,</literal>, <literal>-</literal>, <literal>(</literal>
oder <literal>)</literal>
</entry>
<entry>Beispiel: <literal>/</literal></entry>
</row>
<row>
<entry>
<literal>;</literal>,
<literal>:</literal>, <literal>/</literal>, <literal>.</literal>,
<literal>,</literal>, <literal>-</literal>, <literal>(</literal>
oder <literal>)</literal>
</entry>
<entry>Das angegebene Zeichen</entry>
<entry>Beispiel: <literal>-</literal></entry>
</row>
<row>
<entry><literal>?</literal></entry>
<entry>Ein beliebiges Byte</entry>
<entry>
Beispiel: <literal>^</literal> (es ist zu beachten, dass für
UTF-8-Zeichen möglicherweise mehr als ein <literal>?</literal>
benötigt wird. In diesem Fall ist es wahrscheinlich besser,
<literal>*</literal> zu verwenden)
</entry>
</row>
<row>
<entry><literal>*</literal></entry>
<entry>
Beliebige Bytes bis zum nächsten Trennzeichen oder zur nächsten Ziffer
</entry>
<entry>
Beispiel: <literal>*</literal> in <literal>Y-*-d</literal>
entspricht in Verbindung mit der Zeichenkette
<literal>2009-aWort-08</literal> dem Wert
<literal>aWort</literal>
</entry>
</row>
<row>
<entry><literal>!</literal></entry>
<entry>
Setzt alle Felder (Jahr, Monat, Tag, Stunde, Minute, Sekunde,
Bruchteil und Zeitzone) auf ihre Ausgangswerte zurück
(<literal>0</literal> bei Stunde, Minute, Sekunde und Bruchteil;
<literal>1</literal> bei Monat und Tag; <literal>1970</literal> bei
Jahr und <literal>UTC</literal> bei der Zeitzone)
</entry>
<entry>
Ohne <literal>!</literal> werden alle Felder auf das aktuelle
Datum und die aktuelle Uhrzeit gesetzt.
</entry>
</row>
<row>
<entry><literal>|</literal></entry>
<entry>
Setzt die Werte der noch nicht ausgewerteten Felder (Jahr, Monat,
Tag, Stunde, Minute, Sekunde, Zeitzone) auf ihre Ausgangswerte zurück
</entry>
<entry>
<literal>Y-m-d|</literal> setzt Jahr, Monat und Tag entsprechend
der Informationen aus der ausgewerteten Zeichenkette und setzt
Stunde, Minute und Sekunde auf 0
</entry>
</row>
<row>
<entry><literal>+</literal></entry>
<entry>
Wenn dieses Formatzeichen verwendet wird, führen nachfolgende
Daten in der Zeichenkette nicht zu einem Fehler, sondern zu einer
Warnung
</entry>
<entry>
Um zu überprüfen, ob nachfolgende Daten vorhanden waren, kann
<methodname>DateTimeImmutable::getLastErrors</methodname> verwendet
werden.
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
Wenn die Formatzeichenkette Zeichen enthält, die nicht erkannt werden,
schlägt die Auswertung fehl und es wird eine Fehlermeldung an die
zurückgegebene Struktur angehängt. Die Fehlermeldungen können mit
<methodname>DateTimeImmutable::getLastErrors</methodname> abgefragt
werden.
</para>
<para>
Wenn literale Zeichen in <parameter>format</parameter> verwendet werden,
müssen diese mit einem Backslash (<literal>\</literal>) maskiert werden.
</para>
<para>
Wenn <parameter>format</parameter> nicht das Zeichen
<literal>!</literal> enthält, werden die Teile des Datums und der
Uhrzeit, die nicht in <parameter>format</parameter> angegeben sind, auf
die aktuelle Systemzeit gesetzt.
</para>
<para>
Wenn <parameter>format</parameter> das Zeichen <literal>!</literal>
enthält, werden die Teile des Datums und der Uhrzeit, die nicht in
<parameter>format</parameter> angegeben sind, sowie die Werte links von
<literal>!</literal> auf die entsprechenden Werte der Unix-Epoche gesetzt.
</para>
<para>
Wenn ein Zeichen der Uhrzeit ausgewertet wird, werden alle anderen
zeitbezogenen Felder auf "0" gesetzt, sofern sie nicht ebenfalls
ausgewertet werden.
</para>
<para>
Die Unix-Epoche ist 1970-01-01 00:00:00 UTC.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>datetime</parameter></term>
<listitem>
<para>
Eine Zeichenkette, die die Zeit angibt.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>timezone</parameter></term>
<listitem>
<para>
Ein <classname>DateTimeZone</classname>-Objekt, das die gewünschte
Zeitzone darstellt.
</para>
<para>
Wenn <parameter>timezone</parameter> nicht angegeben wird oder &null;
ist und <parameter>datetime</parameter> keine Zeitzone enthält, wird die
aktuelle Zeitzone verwendet.
</para>
<note>
<para>
Wenn der Parameter <parameter>datetime</parameter> entweder einen
UNIX-Zeitstempel enthält (&zb; <literal>946684800</literal>) oder
eine Zeitzone vorgibt (&zb;
<literal>2010-01-28T15:00:00+02:00</literal>), werden der Parameter
<parameter>timezone</parameter> und die aktuelle Zeitzone ignoriert.
</para>
</note>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
Gibt eine neue DateTimeImmutable-Instanz zurück. &return.falseforfailure;
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
Wenn der Parameter <parameter>datetime</parameter> NULL-Bytes enthält,
wirft diese Methode einen <exceptionname>ValueError</exceptionname>.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.2.9</entry>
<entry>
Das <literal> </literal>- (Leerraum) Zeichen unterstützt nun auch die
Zeichen NBSP (U+A0) und NNBSP (U+202F).
</entry>
</row>
<row>
<entry>8.2.0</entry>
<entry>
Die <parameter>format</parameter>-Zeichen <literal>X</literal> und
<literal>x</literal> wurden hinzugefügt.
</entry>
</row>
<row>
<entry>8.0.21, 8.1.8, 8.2.0</entry>
<entry>
Wenn in <parameter>datetime</parameter> NULL-Bytes übergeben werden,
wird nun ein <exceptionname>ValueError</exceptionname> geworfen;
vorher wurde dies stillschweigend ignoriert.
</entry>
</row>
<row>
<entry>7.3.0</entry>
<entry>
Das <parameter>format</parameter>-Zeichen <literal>v</literal> wurde
hinzugefügt.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<example>
<title><function>DateTimeImmutable::createFromFormat</function>-Beispiel</title>
<para>&style.oop;</para>
<programlisting role="php">
<![CDATA[
<?php
$date = DateTimeImmutable::createFromFormat('j-M-Y', '15-Feb-2009');
echo $date->format('Y-m-d');
?>
]]>
</programlisting>
</example>
<example>
<title>Verwendung von <function>DateTimeImmutable::createFromFormat</function> mit vordefinierten Formatkonstanten</title>
<para>&style.oop;</para>
<programlisting role="php">
<![CDATA[
<?php
$date = DateTimeImmutable::createFromFormat(DateTimeInterface::ISO8601, '2004-02-12T15:19:21+00:00');
$date = DateTimeImmutable::createFromFormat(DateTimeInterface::RFC3339_EXTENDED, '2013-10-14T09:00:00.000+02:00');
?>
]]>
</programlisting>
<para>
Die in diesem Beispiel verwendeten
<link linkend="datetimeinterface.constants.types">Formatierungskonstanten</link>
bestehen aus einer Reihe von Zeichen für die
<link linkend="datetime.format">Formatierung</link> eines
<classname>DateTimeImmutable</classname>-Objekts. In den meisten Fällen
stimmen diese Buchstaben mit den entsprechenden Elementen der
Datums-/Zeitinformationen überein, wie sie im obigen Abschnitt
<link linkend="datetimeimmutable.createfromformat.parameters">parameters</link>
definiert sind, aber sie sind in der Regel etwas weniger strikt.
</para>
</example>
<example>
<title>Besonderheiten von <function>DateTimeImmutable::createFromFormat</function></title>
<programlisting role="php">
<![CDATA[
<?php
echo 'Aktuelle Zeit: ' . date('Y-m-d H:i:s') . "\n";
$format = 'Y-m-d';
$date = DateTimeImmutable::createFromFormat($format, '2009-02-15');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
$format = 'Y-m-d H:i:s';
$date = DateTimeImmutable::createFromFormat($format, '2009-02-15 15:16:17');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
$format = 'Y-m-!d H:i:s';
$date = DateTimeImmutable::createFromFormat($format, '2009-02-15 15:16:17');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
$format = '!d';
$date = DateTimeImmutable::createFromFormat($format, '15');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
$format = 'i';
$date = DateTimeImmutable::createFromFormat($format, '15');
echo "Format: $format; " . $date->format('Y-m-d H:i:s') . "\n";
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Aktuelle Zeit: 2022-06-02 15:50:46
Format: Y-m-d; 2009-02-15 15:50:46
Format: Y-m-d H:i:s; 2009-02-15 15:16:17
Format: Y-m-!d H:i:s; 1970-01-15 15:16:17
Format: !d; 1970-01-15 00:00:00
Format: i; 2022-06-02 00:15:00
]]>
</screen>
</example>
<example>
<title>Formatzeichenkette mit literalen Zeichen</title>
<programlisting role="php">
<![CDATA[
<?php
echo DateTimeImmutable::createFromFormat('H\h i\m s\s','23h 15m 03s')->format('H:i:s');
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
23:15:03
]]>
</screen>
</example>
<example>
<title>Verhalten bei einem Überlauf</title>
<programlisting role="php">
<![CDATA[
<?php
echo DateTimeImmutable::createFromFormat('Y-m-d H:i:s', '2021-17-35 16:60:97')->format(DateTimeImmutable::RFC2822);
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Sat, 04 Jun 2022 17:01:37 +0000
]]>
</screen>
<para>
Das Ergebnis sieht zwar merkwürdig aus, ist aber korrekt, da die
folgenden Überläufe erfolgen:
</para>
<orderedlist>
<listitem>
<simpara>
<literal>97</literal> Sekunden überschreiten <literal>1</literal>
Minute, sodass <literal>37</literal> Sekunden übrig bleiben.
</simpara>
</listitem>
<listitem>
<simpara>
<literal>61</literal> Minuten überschreiten <literal>1</literal> Stunde,
sodass <literal>1</literal> Minute übrig bleibt.
</simpara>
</listitem>
<listitem>
<simpara>
<literal>35</literal> Tage überschreiten <literal>1</literal> Monat,
sodass <literal>4</literal> Tage übrig bleiben. Da nicht jeder Monat die
gleiche Anzahl von Tagen hat, hängt die Anzahl der Tage, die übrig
bleiben, vom Monat ab.
</simpara>
</listitem>
<listitem>
<simpara>
<literal>18</literal> Monate überschreiten <literal>1</literal> Jahr,
sodass <literal>6</literal> Monate übrig bleiben.
</simpara>
</listitem>
</orderedlist>
</example>
<example>
<title>Verhalten bei überlaufenden Tagesnamen</title>
<programlisting role="php">
<![CDATA[
<?php
$d = DateTime::createFromFormat(DateTimeInterface::RFC1123, 'Mon, 3 Aug 2020 25:00:00 +0000');
echo $d->format(DateTime::RFC1123), "\n";
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Mon, 10 Aug 2020 01:00:00 +0000
]]>
</screen>
<para>
Das Ergebnis sieht zwar merkwürdig aus, ist aber korrekt, da die
folgenden Überläufe erfolgen:
</para>
<orderedlist>
<listitem>
<simpara>
<literal>3 Aug 2020 25:00:00</literal> geht über in <literal>(Tue) 4 Aug
2020 01:00</literal>.
</simpara>
</listitem>
<listitem>
<simpara>
<literal>Mon</literal> wird eingesetzt, was das Datum auf <literal>Mon,
10 Aug 2020 01:00:00</literal> vorverlegt. Relative Schlüsselwörter wie
<literal>Mon</literal> werden im Abschnitt über
<link linkend="datetime.formats.relative">relative Formate</link>
erläutert.
</simpara>
</listitem>
</orderedlist>
</example>
<para>
Um Überläufe in Daten zu erkennen, kann die Methode
<methodname>DateTimeImmutable::getLastErrors</methodname> verwendet werden,
die eine Warnung enthält, wenn ein Überlauf aufgetreten ist.
</para>
<example>
<title>Erkennen von übergelaufenen Daten</title>
<programlisting role="php">
<![CDATA[
<?php
$d = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', '2021-17-35 16:60:97');
echo $d->format(DateTimeImmutable::RFC2822), "\n\n";
var_dump(DateTimeImmutable::GetLastErrors());
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Sat, 04 Jun 2022 17:01:37 +0000
array(4) {
'warning_count' =>
int(2)
'warnings' =>
array(1) {
[19] =>
string(27) "The parsed date was invalid"
}
'error_count' =>
int(0)
'errors' =>
array(0) {
}
}
]]>
</screen>
</example>
<example>
<title>Gieriges Verhalten beim Auswerten</title>
<programlisting role="php">
<![CDATA[
<?php
print_r(date_parse_from_format('Gis', '60101'));
?>
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
Array
(
[year] =>
[month] =>
[day] =>
[hour] => 60
[minute] => 10
[second] => 0
[fraction] => 0
[warning_count] => 1
[warnings] => Array
(
[5] => The parsed time was invalid
)
[error_count] => 1
[errors] => Array
(
[4] => A two digit second could not be found
)
[is_localtime] =>
)
]]>
</screen>
<para>
Das Format <literal>G</literal> dient der Auswertung von Uhrzeiten im
24-Stunden-Format, mit oder ohne vorangestellter Null. Dies erfordert die
Analyse von 1 oder 2 Ziffern. Da zwei Ziffern folgen, wird dies gierig als
<literal>60</literal> gelesen.
</para>
<para>
Die folgenden Formatzeichen <literal>i</literal> und <literal>s</literal>
benötigen beide zwei Ziffern. Das bedeutet, dass <literal>10</literal> als
Minute (<literal>i</literal>) übergeben wird, und dass dann nicht mehr
genug Ziffern übrig sind, um sie als Sekunde (<literal>s</literal>) zu
verarbeiten.
</para>
<para>
Das Array <literal>errors</literal> zeigt dieses Problem an.
</para>
<para>
Außerdem liegt der Wert <literal>60</literal> für die Stunde außerhalb des
Bereichs <literal>0</literal>-<literal>24</literal>, was dazu führt, dass
das Array <literal>warnings</literal> eine Warnung enthält, dass die Zeit
ungültig ist.
</para>
</example>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<simplelist>
<member><function>DateTimeImmutable::__construct</function></member>
<member><function>DateTimeImmutable::getLastErrors</function></member>
<member><function>checkdate</function></member>
<member><function>strptime</function></member>
</simplelist>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->