2009-06-15 3 views
3

J'ai utilisé la classe DateTime en PHP parce que date() a les inconvénients d'Unix Timestamp. Cependant, aucune approche ne détecte des dates non valides pour les mois qui n'ont pas 31 jours mais qui tentent d'utiliser le 31ème jour.Comment puis-je attraper '02/31/2010 'comme une date invalide en utilisant la classe DateTime?

Exemple de code:

try { 
$date = new DateTime('02/31/2018'); 
$formattedDate = $date->format('Y-m-d'); 
} catch (Exception $e) {} 
echo $formattedDate; 

Résultat:

2018-03-03 

Mise à jour 1: Pour utiliser checkdate() J'ai besoin des éléments constitutifs de la date. Pour obtenir cela, je vais devoir instancier un objet DateTime avec la chaîne de date en tant que constructeur. Dans le cas de '02/31/2018 ', il le convertira en '03/03/2018' lorsqu'il sera instancié. À ce stade, il sera trop tard pour exécuter le composant mois, jour, année via checkdate(). Quelle est la solution?

Mise à jour 2: Obtenir la partie composante des dates est facile si je force un format spécifique (par exemple mm/jj/aaaa), mais si je l'accepte tous les formats acceptés par strtotime(), je ne peux pas effectuer une checkdate avant de l'exécuter via strtotime() -> date() ou DateTime :: __ construct -> DateTime :: format().

Répondre

0

Pour obtenir les composants de la date, vous pouvez simplement diviser la chaîne ...

$date = explode('/','02/18/2018'); 

Ensuite, utilisez checkdate(), maintenant que vous avez les composants.

6

Essayez la fonction checkdate.

Vérifie la validité de la date formée par les arguments. Une date est considérée valide si chaque paramètre est correctement défini .

Paramètres

mois

Le mois est compris entre 1 et 12 inclus.

jour

Le jour est dans le nombre autorisé de jours pour le mois donné. Les années bissextiles sont prises en considération .

année

L'année se situe entre 1 et 32767 inclus.

2

Étendre DateTime et réimplémenter le constructeur par défaut pour utiliser checkdate. peu plus facile de le faire une fois et remplacer toutes les DateTime ( avec MyDateTime ( de sorte que vous pouvez ajouter plus de contrôles que vous progressez. Par exemple Année> 1940 ...