HOWTO · PHP

Comment convertir une chaîne de caractères en date et en heure en PHP

Découvrez plusieurs façons d’analyser une chaîne de date en PHP, avec strtotime() et date(), ou avec DateTime::createFromFormat() et date_create_from_format().

Sur cette page

Une chaîne de date reste du texte tant que PHP ne l’a pas analysée. L’analyse interprète ce texte comme un horodatage ou un objet date-heure ; le formatage convertit ensuite la valeur obtenue dans la représentation dont votre application a besoin. Choisissez strtotime() pour une expression de date courante et sans ambiguïté. Si la chaîne suit un format connu, préférez un format explicite avec DateTime::createFromFormat() ou son équivalent procédural, date_create_from_format().

Choisir la bonne méthode d’analyse des dates en PHP

Utilisez strtotime() pour des chaînes courantes, comme une date au format ISO, lorsque vous acceptez une interprétation flexible. Cette fonction renvoie un horodatage Unix ou false, et date() formate un horodatage. Pour un format d’entrée fixe, la méthode DateTime::createFromFormat() explicite l’ordre attendu des champs et renvoie un objet date-heure ou false. La fonction procédurale date_create_from_format() propose le même type d’analyse sans appeler directement la méthode statique.

Ces fonctions ne lèvent pas l’ambiguïté d’une entrée. Si les utilisateurs peuvent saisir des dates selon différentes conventions, définissez le format attendu au moment de la saisie et validez la valeur. Dans tous les cas, choisissez délibérément le fuseau horaire lors de l’interprétation d’une date-heure ; sinon, PHP utilise le fuseau horaire par défaut configuré.

Analyser des chaînes de date flexibles avec strtotime() et date()

Pour une chaîne date-heure courante, analysez-la avec strtotime(), puis transmettez l’horodatage obtenu à date(). Vérifiez que le résultat n’est pas false avant le formatage, afin de ne pas utiliser un échec d’analyse comme horodatage. L’exemple utilise des formats d’entrée et de sortie fixes ; son résultat est donc reproductible quelle que soit l’heure actuelle de la machine.

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

<?php
$dateString = '2023-10-15 14:30:00';
$timestamp = strtotime($dateString);

if ($timestamp === false) {
    echo "Could not parse the date string.";
} else {
    echo date('Y-m-d H:i:s', $timestamp);
}

strtotime() accepte de nombreuses expressions de date, mais cette souplesse ne remplace pas la définition d’un format d’entrée. Le résultat représente un instant interprété selon les règles du fuseau horaire ; date() formate l’horodatage selon le fuseau horaire par défaut de PHP. Si le fuseau horaire de la source est connu, indiquez-le ou appliquez-le explicitement au lieu de vous fier à la configuration du serveur.

Analyser une date selon un format connu avec DateTime::createFromFormat()

Lorsque la chaîne a une structure définie, fournissez la chaîne de format correspondante. Dans le format ci-dessous, d, m, Y, H et i désignent respectivement le jour, le mois, l’année sur quatre chiffres, l’heure et les minutes. Le ! initial réinitialise les champs absents de l’entrée, au lieu de reprendre les secondes de la date actuelle ou d’autres champs.

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

<?php
$dateString = '15-10-2023 14:30';
$dateFormat = '!d-m-Y H:i';
$dateTime = DateTime::createFromFormat($dateFormat, $dateString);

if ($dateTime === false) {
    echo "Could not parse the date string.";
} else {
    echo $dateTime->format('Y-m-d H:i:s');
}

Le format doit décrire l’entrée, et non la sortie souhaitée. Après l’analyse, appelez format() avec le modèle de sortie voulu. Un résultat différent de false ne garantit pas à lui seul que chaque composante du calendrier a été acceptée exactement comme prévu : PHP peut normaliser certaines valeurs hors limites et signaler des avertissements. Pour valider strictement l’entrée, examinez DateTime::getLastErrors() après l’analyse, comme indiqué ci-dessous.

Utiliser la fonction procédurale date_create_from_format()

La fonction procédurale convient au code qui utilise déjà les fonctions de date de PHP. Elle accepte le même format et la même chaîne d’entrée, puis renvoie un objet DateTime en cas de réussite ou false si l’analyse échoue. Formatez l’objet renvoyé avec date_format() uniquement après avoir vérifié qu’il s’agit bien d’un objet.

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

<?php
$dateString = '2023/10/15 14:30';
$dateFormat = '!Y/m/d H:i';
$dateTime = date_create_from_format($dateFormat, $dateString);

if ($dateTime === false) {
    echo "Could not parse the date string.";
} else {
    echo date_format($dateTime, 'Y-m-d H:i:s');
}

Il s’agit de l’alternative procédurale à DateTime::createFromFormat() : les deux méthodes analysent la chaîne selon le format fourni et produisent un objet DateTime. Choisissez le style qui s’accorde avec le code environnant. Il n’est pas nécessaire de se baser sur une version de PHP pour choisir entre elles ; consultez la documentation de la version prise en charge par votre application pour vérifier la disponibilité de l’API.

Gérer les entrées ambiguës, les erreurs d’analyse et les fuseaux horaires

Une chaîne comme 03/04/2023 peut désigner le 4 mars ou le 3 avril, selon la convention utilisée. Ne vous fiez pas aux seuls séparateurs pour déterminer l’intention. Si la structure de la source est connue, transmettez son format exact à DateTime::createFromFormat() et validez le résultat. strtotime() est pratique pour les chaînes courantes dont le format est clairement défini, mais ne peut pas deviner la convention voulue par l’utilisateur.

DateTime::createFromFormat() et date_create_from_format() peuvent renvoyer false ; vérifiez ce résultat avant d’appeler une méthode de l’objet ou date_format(). Ces fonctions peuvent aussi accepter une valeur tout en signalant des avertissements d’analyse, par exemple lorsqu’elles normalisent une composante de date. Lorsque la validité exacte de la date est importante, vérifiez également les diagnostics d’analyse :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

<?php
$dateTime = DateTime::createFromFormat('!Y-m-d', '2023-02-31');
$errors = DateTime::getLastErrors();

if ($dateTime === false || ($errors !== false && ($errors['warning_count'] > 0 || $errors['error_count'] > 0))) {
    echo "The date is not valid for the specified format.";
} else {
    echo $dateTime->format('Y-m-d');
}

Le ! réinitialise les champs non spécifiés, tandis que getLastErrors() signale les avertissements et les erreurs de l’analyse la plus récente. Les détails de ces diagnostics peuvent varier selon la version de PHP ; testez donc votre politique de validation sur les versions prises en charge par votre application. Pour les dates-heures associées à une région particulière, créez un DateTimeZone correspondant à cette région et transmettez-le comme troisième argument à DateTime::createFromFormat() (ou comme argument de fuseau horaire correspondant pour la fonction procédurale). Si l’entrée contient un décalage UTC explicite, conservez-le ou convertissez-le délibérément avant le formatage destiné à l’affichage.