date_parse_from_format

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

date_parse_from_formatRécupère les informations d'une date donnée suivant un format spécifique

Description

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

Retourne un tableau associatif contenant des informations détaillées sur une date/moment donnée.

Liste de paramètres

format

Documentation sur l'utilisation du format, veuillez vous référer à la documentation de DateTimeImmutable::createFromFormat(). Les mêmes règles s'appliquent.

datetime

Chaîne représentant la date/moment.

Valeurs de retour

Retourne un tableau associatif avec des informations détaillées sur la date/moment donnée.

Le tableau retourné a des clés pour year, month, day, hour, minute, second, fraction, et is_localtime.

Si is_localtime est présent, alors zone_type indique le type de fuseau horaire. Pour le type 1 (décalage UTC) les champs zone et is_dst sont ajoutés. Pour le type 2 (abréviation) les champs tz_abbr et is_dst sont ajoutés. Pour le type 3 (identifiant de fuseau horaire) les champs tz_abbr et tz_id sont ajoutés.

Le tableau inclus les champs warning_count et warnings. Le premier indique le nombre d'avertissements. Les clés du tableau warnings indiquent la position dans le paramètre datetime où l'avertissement s'est produit, avec la valeur de chaîne décrivant l'avertissement lui-même. Un exemple ci-dessous montre un tel avertissement.

Le tableau inclus aussi les champs error_count et errors fields. Le premier indique le nombre d'erreurs. Les clés du tableau errors indiquent la position dans le paramètre datetime où l'erreur s'est produite, avec la valeur de chaîne décrivant l'avertissement lui-même. Un exemple ci-dessous montre un tel avertissement.

Avertissement

Le nombre d'éléments de tableau dans les tableaux warnings et errors peut être inférieur à warning_count ou error_count s'ils se sont produits à la même position.

Erreurs / Exceptions

Cette fonction lance une ValueError lorsque le datetime contient des octets NULL.

Historique

Version Description
8.0.21, 8.1.8, 8.2.0 Lance désormais une ValueError lorsque des octets NULL sont passés dans datetime, ce qui était auparavant ignoré silencieusement.
7.2.0 L'élément zone du tableau retourné représente des secondes au lieu de minutes maintenant, et son signe est inversé. Par exemple -120 est maintenant égal à 7200.

Exemples

Exemple #1 Exemple avec date_parse_from_format()

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

L'exemple ci-dessus va afficher :

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

Exemple #2 Exemple de date_parse_from_format() avec des warnings (avertissements)

<?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";
}
?>

L'exemple ci-dessus va afficher :

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

Exemple #3 Exemple de date_parse_from_format() avec des errors (erreurs)

<?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";
}
?>

L'exemple ci-dessus va afficher :

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

Voir aussi

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