date_parse_from_format

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

date_parse_from_formatErmittelt Informationen über das angegebene Datum anhand des angegebenen Formats

Beschreibung

date_parse_from_format(string $format, string $datetime): array

Gibt ein assoziatives Array mit detaillierten Informationen über das angegebene Datum und die angegebene Uhrzeit zurück.

Parameter-Liste

format

Zur Verwendung des Parameters format siehe die Dokumentation von DateTimeImmutable::createFromFormat(). Es gelten die gleichen Regeln.

datetime

Eine Zeichenkette, die Datum und Uhrzeit angibt.

Rückgabewerte

Gibt ein assoziatives Array mit detaillierten Informationen über das angegebene Datum und die angegebene Uhrzeit zurück.

Das zurückgegebene Array hat Schlüssel für year, month, day, hour, minute, second, fraction und is_localtime.

Wenn is_localtime angegeben ist, gibt zone_type den Typ der Zeitzone an. Für Typ 1 (UTC-Offset) werden die Felder zone und is_dst hinzugefügt; für Typ 2 (Zeitzonen-Abkürzung) werden die Felder tz_abbr und is_dst hinzugefügt; und für Typ 3 (Zeitzonen-Kennung) werden die Felder tz_abbr und tz_id hinzugefügt.

Das Array enthält die Felder warning_count und warnings. Das erste gibt an, wie viele Warnungen es gab. Die Schlüssel des Arrays warnings geben die Positionen im angegebenen datetime an, an denen die Warnungen aufgetreten sind, während die Werte die Warnungen selbst beschreiben. Das folgende Beispiel zeigt eine solche Warnung.

Das Array enthält auch die Felder error_count und errors. Das erste Feld gibt an, wie viele Fehler gefunden wurden. Die Schlüssel des Arrays errors geben die Positionen im angegebenen datetime an, an denen die Fehler aufgetreten sind, während die Werte die Fehler selbst beschreiben. Das folgende Beispiel zeigt einen solchen Fehler.

Warnung

Die Anzahl der Array-Elemente in den Arrays warnings und errors kann kleiner sein als warning_count oder error_count, wenn die Warnungen bzw. Fehler an derselben Stelle aufgetreten sind.

Fehler/Exceptions

Wenn der Parameter datetime NULL-Bytes enthält, wirft diese Funktion einen ValueError.

Changelog

Version Beschreibung
8.0.21, 8.1.8, 8.2.0 Wenn in datetime NULL-Bytes übergeben werden, wird nun ein ValueError geworfen; vorher wurde dies stillschweigend ignoriert.
7.2.0 Das Element zone des zurückgegebenen Arrays stellt nun Sekunden statt Minuten dar und das Vorzeichen ist umgekehrt. Zum Beispiel wird aus -120 nun 7200.

Beispiele

Beispiel #1 date_parse_from_format()-Beispiel

<?php
$date
= "6.1.2009 13:00+01:00";
print_r(date_parse_from_format("j.n.Y H:iP", $date));
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Array
(
    [year] => 2009
    [month] => 1
    [day] => 6
    [hour] => 13
    [minute] => 0
    [second] => 0
    [fraction] =>
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 1
    [zone_type] => 1
    [zone] => 3600
    [is_dst] =>
)

Beispiel #2 date_parse_from_format()-Beispiel mit Warnungen

<?php
$date
= "26 August 2022 22:30 pm";
$parsed = date_parse_from_format("j F Y G:i a", $date);

echo
"Anzahl der Warnungen: ", $parsed['warning_count'], "\n";
foreach (
$parsed['warnings'] as $position => $message) {
echo
"\tAn Position {$position}: {$message}\n";
}
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Anzahl der Warnungen: 1
	An Position 23: The parsed time was invalid

Beispiel #3 date_parse_from_format()-Beispiel mit Fehlern

<?php
$date
= "26 August 2022 CEST";
$parsed = date_parse_from_format("j F Y H:i", $date);

echo
"Anzahl der Fehler: ", $parsed['error_count'], "\n";
foreach (
$parsed['errors'] as $position => $message) {
echo
"\tAn Position {$position}: {$message}\n";
}
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Anzahl der Fehler: 3
	An Position 15: A two digit hour could not be found
	An Position 19: Data missing

Siehe auch

add a note add a note

User Contributed Notes 2 notes

up
24
Archetrix
9 years ago
For use in Versions prior V5.3:

<?php
if (!function_exists('date_parse_from_format')) {

    function
date_parse_from_format($format, $date) {
       
// reverse engineer date formats
       
$keys = array(
           
'Y' => array('year', '\d{4}'),
           
'y' => array('year', '\d{2}'),
           
'm' => array('month', '\d{2}'),
           
'n' => array('month', '\d{1,2}'),
           
'M' => array('month', '[A-Z][a-z]{3}'),
           
'F' => array('month', '[A-Z][a-z]{2,8}'),
           
'd' => array('day', '\d{2}'),
           
'j' => array('day', '\d{1,2}'),
           
'D' => array('day', '[A-Z][a-z]{2}'),
           
'l' => array('day', '[A-Z][a-z]{6,9}'),
           
'u' => array('hour', '\d{1,6}'),
           
'h' => array('hour', '\d{2}'),
           
'H' => array('hour', '\d{2}'),
           
'g' => array('hour', '\d{1,2}'),
           
'G' => array('hour', '\d{1,2}'),
           
'i' => array('minute', '\d{2}'),
           
's' => array('second', '\d{2}')
        );

       
// convert format string to regex
       
$regex = '';
       
$chars = str_split($format);
        foreach (
$chars AS $n => $char) {
           
$lastChar = isset($chars[$n - 1]) ? $chars[$n - 1] : '';
           
$skipCurrent = '\\' == $lastChar;
            if (!
$skipCurrent && isset($keys[$char])) {
               
$regex .= '(?P<' . $keys[$char][0] . '>' . $keys[$char][1] . ')';
            } else if (
'\\' == $char) {
               
$regex .= $char;
            } else {
               
$regex .= preg_quote($char);
            }
        }

       
$dt = array();
       
$dt['error_count'] = 0;
       
// now try to match it
       
if (preg_match('#^' . $regex . '$#', $date, $dt)) {
            foreach (
$dt AS $k => $v) {
                if (
is_int($k)) {
                    unset(
$dt[$k]);
                }
            }
            if (!
checkdate($dt['month'], $dt['day'], $dt['year'])) {
               
$dt['error_count'] = 1;
            }
        } else {
           
$dt['error_count'] = 1;
        }
       
$dt['errors'] = array();
       
$dt['fraction'] = '';
       
$dt['warning_count'] = 0;
       
$dt['warnings'] = array();
       
$dt['is_localtime'] = 0;
       
$dt['zone_type'] = 0;
       
$dt['zone'] = 0;
       
$dt['is_dst'] = '';
        return
$dt;
    }

}
?>

Not my invention though. I found it here: http://stackoverflow.com/questions/6668223/php-date-parse-from-format-alternative-in-php-5-2

Thought this might be a good place to keep a copy in case someone stumbles upon the same problem facing outdated PHP versions on customer servers ....
up
1
gilles dot migliori at gmail dot com
5 years ago
$date = "10 October 2018 19:30 pm";
print_r (date_parse_from_format("j F Y G:i a", $date));

Output:

Array (
    [year]          => 2018
    [month]         => 10
    [day]           => 10
    [hour]          => 31
    [minute]        => 30
    [second]        => 0
    [fraction]      =>
    [warning_count] => 1
    [warnings]      => Array (
                        [24] => The parsed time was invalid
                    )
    [error_count]   => 0
    [errors]        => Array ( )
    [is_localtime]  =>
)

19:30 pm is invalid, 24-hour format of an hour can't be used with am/pm

must be replaced with:

$date = "10 October 2018 19:30";
print_r (date_parse_from_format("j F Y G:i", $date));

or:

$date = "10 October 2018 7:30 pm";
print_r (date_parse_from_format("j F Y g:i a", $date));
To Top