La méthode PHP DateTime::modify peut être utilisée pour ajouter et soustraire des mois.
P粉046387133
2023-08-06 18:43:52
<p>J'utilise beaucoup la classe DateTime et j'ai récemment rencontré ce que je pensais être un bug lors de l'ajout de mois. Après quelques recherches, il a été découvert qu’il ne s’agissait pas réellement d’un bug et qu’il fonctionnait comme prévu. D'après la documentation trouvée ici : </p>
<blockquote>
<p>Exemple n°2 Soyez prudent lorsque vous ajoutez ou
soustraire des mois</p>
</blockquote>
<pre class="brush:php;toolbar:false;"><?php
$date = new DateTime('2000-12-31');
$date->modify('+1 mois');
echo $date->format('Y-m-d') .
$date->modify('+1 mois');
echo $date->format('Y-m-d') .
?>≪/pré>
<blockquote>
<pre class="brush:php;toolbar:false;">L'exemple ci-dessus affichera :
2001-01-31
2001-03-03≪/pré>
</blockquote>
<p>Quelqu'un peut-il expliquer pourquoi cela n'est pas considéré comme un bug ? <br /><br />De plus, quelqu'un a-t-il une solution élégante pour corriger cela afin que +1 mois fonctionne comme prévu plutôt que comme prévu ? </p><p><br /></p>
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.
Sa sortie est :
Pourquoi ce n'est pas un bug :
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 :
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.