recherche

Maison  >  Questions et réponses  >  le corps du texte

La méthode PHP DateTime::modify peut être utilisée pour ajouter et soustraire des mois.

<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>
P粉046387133P粉046387133474 Il y a quelques jours591

répondre à tous(2)je répondrai

  • P粉709307865

    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

    répondre
    0
  • P粉030479054

    P粉0304790542023-08-07 09:48:12

    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 :

    <?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.

    répondre
    0
  • Annulerrépondre