Maison >développement back-end >tutoriel php >Pourquoi DateTime::modify de PHP se comporte-t-il de manière inattendue lors de l'ajout de mois ?
Lorsqu'il s'agit de dates et de modificateurs, la classe PHP DateTime présente des comportements uniques qui ne correspondent pas toujours à nos attentes. Un scénario courant implique l'ajout de mois, et la gestion de la classe peut être contre-intuitive au début.
Considérez l'extrait de code suivant :
$date = new DateTime('2000-12-31'); $date->modify('+1 month'); echo $date->format('Y-m-d') . "\n"; $date->modify('+1 month'); echo $date->format('Y-m-d') . "\n";
Si on s'attend à ce que le code avance la date au 1er le mois suivant et son successeur, nous rencontrons un résultat surprenant :
2001-01-31 2001-03-03
Au lieu du 2001-02-01 attendu, nous obtenons le 2001-01-31. Pourquoi cela se produit-il ?
La classe DateTime gère l'ajout de mois d'une manière qui prend en compte le format de date interne. Lorsque l'on ajoute un mois au 31 décembre, la date interne devient le 31/02/2001. Cependant, selon le calendrier, février 2001 ne compte que 28 jours, donc PHP s'ajuste automatiquement au 3 mars.
Ce n'est pas un bug mais plutôt un comportement intentionnel, garantissant que les dates restent toujours dans une plage valide.
Pendant Le comportement par défaut de PHP n'est pas toujours idéal, il existe des solutions élégantes pour l'ajuster :
Intervention manuelle :
Vérifiez le mois suivant et ajoutez manuellement le bon nombre de jours à avancer à la date souhaitée.
Le "premier jour de" de PHP 5.3 Modificateur :
Pour PHP 5.3 et versions ultérieures, vous pouvez utiliser le modificateur "premier jour de" pour passer au premier jour du mois suivant :
$d = new DateTime( '2010-01-31' ); $d->modify( 'first day of next month' ); echo $d->format( 'F' ), "\n"; // Outputs "February"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!