date_parse_from_format

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

date_parse_from_formatGet info about given date formatted according to the specified format

Description

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

Returns associative array with detailed info about given date/time.

Parameters

format

Documentation on how the format is used, please refer to the documentation of DateTimeImmutable::createFromFormat(). The same rules apply.

datetime

String representing the date/time.

Return Values

Returns associative array with detailed info about given date/time.

The returned array has keys for year, month, day, hour, minute, second, fraction, and is_localtime.

If is_localtime is present then zone_type indicates the type of timezone. For type 1 (UTC offset) the zone, is_dst fields are added; for type 2 (abbreviation) the fields tz_abbr, is_dst are added; and for type 3 (timezone identifier) the tz_abbr, tz_id are added.

The array includes warning_count and warnings fields. The first one indicate how many warnings there were. The keys of elements warnings array indicate the position in the given datetime where the warning occurred, with the string value describing the warning itself. An example below shows such a warning.

The array also contains error_count and errors fields. The first one indicate how many errors were found. The keys of elements errors array indicate the position in the given datetime where the error occurred, with the string value describing the error itself. An example below shows such an error.

Warning

The number of array elements in the warnings and errors arrays might be less than warning_count or error_count if they occurred at the same position.

Errors/Exceptions

This functions throws ValueError when the datetime contains NULL-bytes.

Changelog

Version Description
8.0.21, 8.1.8, 8.2.0 Now throws ValueError when NULL-bytes are passed into datetime, which previously was silently ignored.
7.2.0 The zone element of the returned array represents seconds instead of minutes now, and its sign is inverted. For instance -120 is now 7200.

Examples

Example #1 date_parse_from_format() example

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

The above example will output:

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] =>
)

Example #2 date_parse_from_format() with warnings example

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

echo
"Warnings count: ", $parsed['warning_count'], "\n";
foreach (
$parsed['warnings'] as $position => $message) {
echo
"\tOn position {$position}: {$message}\n";
}
?>

The above example will output:

Warnings count: 1
	On position 23: The parsed time was invalid

Example #3 date_parse_from_format() with errors example

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

echo
"Errors count: ", $parsed['error_count'], "\n";
foreach (
$parsed['errors'] as $position => $message) {
echo
"\tOn position {$position}: {$message}\n";
}
?>

The above example will output:

Errors count: 3
	On position 15: A two digit hour could not be found
	On position 19: Data missing

See Also

add a note add a note

User Contributed Notes 2 notes

up
20
Archetrix
10 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
6 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