39 votes

Vérifier si une variable est une date valide avec PHP

Je travaille sur un script qui va importer des données à partir d'un fichier CSV. En faisant cela, je veux être capable de vérifier une variable pour voir si c'est une chaîne de date valide.

J'ai vu plusieurs façons de vérifier si une piqûre est une date, mais la plupart d'entre elles exigent que vous connaissiez le format. Je ne connais pas le format de la date.

Pour l'instant, j'utilise strtotime(), mais cela ne permet pas de facilement

$field ="May";
if(strtotime($field)){
    echo "This is a date";
}

Dans ce cas, "May" était le prénom de la personne, et pas du tout une date.

Quelqu'un peut-il recommander une fonction plus fiable ?

Modification basée sur les questions de certains d'entre vous.

Pour qu'une variable soit considérée comme une "date" dans mon cas, elle doit être spécifique à un jour/mois/année, donc "mai" serait trop vague pour être pris en compte.

En se basant sur cela et sur le bon point de Paul ci-dessous, nous pouvons également tester pour voir si la chaîne contient un nombre, comme par exemple

$field ="May";
if(strtotime($field) && 1 === preg_match('~[0-9]~', $field)){
    echo "This is a date";
}else{
    echo "Nope not a date";
}

Cela semble couvrir mes besoins immédiats, mais quelqu'un peut-il repérer des problèmes ou suggérer des améliorations ?

57voto

saluce Points 5086

Utilice date_parse et vérifier les valeurs du tableau retourné

$date = date_parse("May")

// ["year"] == FALSE
// ["month"] == 5
// ["day"] == FALSE

Vous pouvez également les passer dans date de contrôle .

$date = date_parse($someString);
if ($date["error_count"] == 0 && checkdate($date["month"], $date["day"], $date["year"]))
    echo "Valid date";
else
    echo "Invalid date";

5voto

Boris Guéry Points 23606

Je ne pense pas qu'il existe une réponse toute faite à ce problème. Vous pouvez avoir une stratégie différente en fonction de votre cas d'utilisation.

Su strtotime() est une solution parfaite, mais comme vous le dites, vous pouvez vous retrouver avec des faux positifs. Pourquoi ? Parce que mai peut être un mot ou un nom. Cependant, quel est le résultat de strtotime('May') ?

echo date(DateTime::ISO8601, strtotime('May'));
2012-05-21T00:00:00+0200

Ainsi, en indiquant uniquement le mois, vous obtiendrez une date correspondant à l'année en cours et au jour en cours à partir de minuit pour le mois indiqué. Une solution possible serait de vérifier si votre chaîne de caractères contient le jour et/ou l'année en cours. De cette façon, vous pouvez vérifier que votre date est une date pleinement qualifiée et valide.

echo date(DateTime::ISO8601, strtotime('May Day')); // (strtotime() returns false)
1970-01-01T01:00:00+0100

echo date(DateTime::ISO8601, strtotime('May 21'));
2012-05-21T00:00:00+0200

Un simple strpos() ou même une regex devrait faire l'affaire.

Cependant c'est un peu bizarre et ne devrait être utilisé que si vous n'avez pas d'autre moyen de faire.

Je pense qu'une meilleure solution serait de définir un ensemble de formats valides et d'interpoler le résultat pour s'assurer que la date est valide.

$validDateFormatPatterns = array(
 '[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}', // 21-05-2012, obviously this pattern is simple and would accept 05-21-2012,
 'the [0-9]{1,2}(th|st|nd|rd) (January|February|...|May|...|December) [0,9]{4}', // The 21st May 2012
);

Vous devriez essayer de couvrir la plupart des cas et je suis sûr que vous serez en mesure de trouver une expression rationnelle qui vérifie le format de date le plus courant.

Dans tous les cas, vous devrez peut-être adapter votre fonction de temps en temps, car il n'y a pas de moyen facile de la rendre infaillible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X