Maison > Questions et réponses > le corps du texte
P粉7093078652023-08-07 13:27:57
Il s'agit d'une autre solution intéressante qui utilise entièrement les méthodes DateTime pour modifier l'objet directement sans créer de clone.
$dt = new DateTime('2012-01-31'); echo $dt->format('Y-m-d'), PHP_EOL; $day = $dt->format('j'); $dt->modify('first day of +1 month'); $dt->modify('+' . (min($day, $dt->format('t')) - 1) . ' days'); echo $dt->format('Y-m-d'), PHP_EOL;
Sa sortie est :
2012-01-31 2012-02-29
P粉0304790542023-08-07 09:48:12
Le comportement actuel est correct. Voici ce qui se passe en interne :
+1 mois augmente le mois (à l'origine 1) de 1. Cela change la date au 2010-02-31.
Février 2010 ne comptait que 28 jours, donc PHP corrigera automatiquement ce problème et continuera à compter les jours à partir du 1er février. La date finale que nous avons obtenue était donc le 3 mars.
Comment obtenir les résultats souhaités :
Pour obtenir les résultats souhaités, vous pouvez vérifier manuellement le mois suivant, puis ajouter le nombre de jours du mois suivant.
J'espère que vous pourrez écrire ce code vous-même. Je fournis simplement des étapes spécifiques.
Approche PHP 5.3 :
Pour obtenir le comportement correct, vous pouvez utiliser l'instruction de temps relative "premier jour de" introduite dans PHP 5.3. Cette instruction peut être utilisée conjointement avec « le mois prochain », « le cinquième mois » ou « +8 mois » pour aller au premier jour du mois spécifié. Par rapport au "+1 mois" que vous utilisez actuellement, vous pouvez utiliser le code suivant pour obtenir le premier jour du mois suivant :
<?php $d = new DateTime( '2010-01-31' ); $d->modify( 'first day of next month' ); echo $d->format( 'F' ), "\n"; ?>
Ce script affichera correctement février. Lorsque PHP traite cette déclaration du premier jour du mois suivant, ce qui suit se produit :
le mois suivant augmente le mois (à l'origine 1) de 1. Cela change la date au 2010-02-31.
premier jour de définit le nombre de jours dans la date à 1, ce qui fait que la date devient le 01/02/2010.