Je reçois une chaîne de date d'une API, et elle est au format yyyy-mm-dd
.
J'utilise actuellement une expression régulière pour valider le format de la chaîne, ce qui fonctionne bien, mais je peux voir certains cas où cela pourrait être un format correct selon la chaîne mais en fait une date invalide. c'est-à 2013-13-01
- dire , par exemple.
Existe-t-il un meilleur moyen en PHP de prendre une chaîne telle que 2013-13-01
et de dire si c'est une date valide ou non pour le format yyyy-mm-dd
?
Réponses:
Vous pouvez utiliser la
DateTime
classe à cet effet:[ Fonction tirée de cette réponse . Aussi sur php.net . Initialement écrit par Glavić . ]
Cas de test:
Démo!
la source
strtotime
pour obtenir l'horodatage unix puisdate('Y-m-d', $t)
pour obtenir la date de la chaîne. Ensuite, vous les comparez comme cette réponse.strtotime
, mais pour les formats non standard quistrtotime
ne reconnaissent pas, vous aurez besoin d'une autre solution. Et pour la version 5.2 de php, le support s'est arrêté en janvier 2011, pour le support de la version 5.3 arrêté en août 2014.var_dump( validateDate('2012-2-9'));
'Y-n-j'
@reignsly.$d
ne sera pas faux en lui donnant la date, qui a survolé des parties, comme le 13ème mois (2013-13-01). Mais cela dépend vraiment de ce que vous voulez. Si vous avez besoin par exemplevalidateDate('2015-55-66')
d'être valide, alors oui, il vous suffit de vérifier si$d
c'est un objet ou non.Déterminer si une chaîne est une date
la source
yyyy-mm-dd
.2015-02-30
comme une date valide car lorsque le jour indiqué est supérieur au nombre de jours du mois donné (ou négatif), php passe au mois suivant. Étant donné que la date est garantie au format,yyyy-mm-dd
cela peut être corrigé en modifiant le retour enreturn (bool)strtotime($myDateString) && date("Y-m-d", strtotime($myDateString)) == $myDateString;
.(bool)strtotime('s')
ce vrai?$myDateString = str_replace("/", '-', $myDateString);
avant le retour si la chaîne de date contient des barres obliques (/) comme: - jj / mm / aaaaUtilisez de manière simple avec la fonction prédéfinie de php:
Tester
la source
if
pour retourner simplementtrue
oufalse
, renvoyer le test lui-même.return sizeof($tmpDate) == 3 && checkdate($tmpDate[1]...
2
,20
,202
,2020
ou même si l'année est20201
- il retourne vrai à chaque fois.Déterminer si la chaîne est une date, même si la chaîne est un format non standard
(strtotime n'accepte aucun format personnalisé)
la source
if
pour retourner simplementtrue
oufalse
, renvoyer le test lui-même.Cette option est non seulement simple mais accepte également presque tous les formats, bien qu'avec des formats non standard, elle puisse être boguée.
la source
202
renvoie un nombre négatif - qui réussit toujours le test.Vous pouvez également analyser la date pour le mois, la date et l'année, puis vous pouvez utiliser la fonction PHP
checkdate()
que vous pouvez lire ici: http://php.net/manual/en/function.checkdate.phpVous pouvez également essayer celui-ci:
la source
La façon la plus simple de vérifier si une date donnée est valide en la convertissant probablement en unixtime en utilisant
strtotime
, en la formatant au format de la date donnée, puis en la comparant:function isValidDate($date) { return date('Y-m-d', strtotime($date)) === $date; }
Bien sûr, vous pouvez utiliser une expression régulière pour vérifier la validité, mais elle sera limitée au format donné, à chaque fois que vous devrez la modifier pour satisfaire un autre format, et elle sera également plus que nécessaire. Les fonctions intégrées sont le meilleur moyen (dans la plupart des cas) de réaliser des travaux.
la source
checkdate()
- mais je trouve que la date de vérification échoue si l'année est une valeur quelconque:2, 20, 202, 2020, 20201
- tous retournent vrai. Je vais avec votre solution!En accord avec la réponse de cl-sah, mais ça sonne mieux, plus court ...
Tester
la source
count($tempDate) === 3
bienJ'ai ce truc qui, même avec PHP, j'aime trouver des solutions fonctionnelles . Ainsi, par exemple, la réponse donnée par @migli est vraiment bonne, très flexible et élégante.
Mais cela pose un problème: que se passe-t-il si vous devez valider un grand nombre de chaînes DateTime avec le même format? Vous auriez à répéter le format partout, ce qui va à l'encontre du principe DRY . Nous pourrions mettre le format dans une constante, mais nous devrons quand même passer la constante en argument à chaque appel de fonction.
Mais n'ayez plus peur! Nous pouvons utiliser le curry à notre secours! PHP ne rend pas cette tâche agréable, mais il est toujours possible d'implémenter le curry avec PHP:
Alors, qu'est-ce que nous venons de faire? Fondamentalement, nous avons enveloppé le corps de la fonction dans un anonyme et renvoyé une telle fonction à la place. Nous pouvons appeler la fonction de validation comme ceci:
Ouais, pas une grande différence ... mais la vraie puissance vient de la fonction partiellement appliquée , rendue possible par le curry:
Programmation fonctionnelle FTW!
la source
J'ai peur que la solution la plus votée ( https://stackoverflow.com/a/19271434/3283279 ) ne fonctionne pas correctement. Le quatrième cas de test (var_dump (validateDate ('2012-2-25')); // false) est faux. La date est correcte, car elle correspond au format - le m autorise un mois avec ou sans zéro non significatif (voir: http://php.net/manual/en/datetime.createfromformat.php ). Par conséquent, une date 2012-2-25 est au format Ymd et le cas de test doit être vrai et non faux.
Je pense que la meilleure solution consiste à tester les erreurs possibles comme suit:
la source
Celui-ci, ça va?
Nous utilisons simplement un bloc try-catch.
Cette approche ne se limite pas à un seul format de date / heure et vous n'avez pas besoin de définir de fonction.
la source
'0000-00-00 00:00:00'
est une valeur datetime valide. C'est juste la première valeur. Cependant, la propriété date de l'objet datetime sera'-0001-11-30 00:00:00'
.Solution Regex testée:
Cela renverra null si la date n'est pas valide ou n'est pas au format aaaa-mm-jj, sinon il renverra la date.
la source
Valider avec la fonction checkdate :
la source
la source
la source
Essayez ceci:
la source