suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Mit der PHP-Methode DateTime::modify können Monate addiert und subtrahiert werden.

<p>Ich habe die DateTime-Klasse häufig verwendet und bin kürzlich beim Hinzufügen von Monaten auf einen meiner Meinung nach fehlerhaften Fehler gestoßen. Nach einigen Recherchen wurde festgestellt, dass es sich hierbei nicht um einen Fehler handelt, sondern wie erwartet funktioniert. Laut der hier gefundenen Dokumentation: </p> <blockquote> <p>Beispiel #2 Seien Sie vorsichtig beim Hinzufügen von oder Monate subtrahieren</p> </blockquote> <pre class="brush:php;toolbar:false;"><?php $date = new DateTime('2000-12-31'); $date->modify('+1 Monat'); echo $date->format('Y-m-d') . $date->modify('+1 Monat'); echo $date->format('Y-m-d') . ?></pre> <blockquote> <pre class="brush:php;toolbar:false;">Das obige Beispiel gibt Folgendes aus: 31.01.2001 2001-03-03</pre> </blockquote> <p>Kann jemand erklären, warum dies nicht als Fehler angesehen wird? <br /><br />Hat jemand außerdem eine elegante Lösung, um dies zu korrigieren, sodass +1 Monat wie erwartet und nicht wie geplant funktioniert? </p><p><br /></p>
P粉046387133P粉046387133474 Tage vor592

Antworte allen(2)Ich werde antworten

  • P粉709307865

    P粉7093078652023-08-07 13:27:57

    这是另一种完全使用DateTime方法的简洁解决方案,可以直接修改对象而不创建克隆。

    $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;

    它的输出是:

    2012-01-31
    2012-02-29

    Antwort
    0
  • P粉030479054

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

    为什么这不是一个错误:

    当前的行为是正确的。以下是内部发生的情况:

    +1个月会将月份(原始为1)增加1。这使得日期变成了2010-02-31。

    2010年的二月只有28天,所以PHP会自动修正这个问题,继续从二月1日开始计算天数。因此,最终得到的日期是3月3日。

    如何得到你想要的结果:
    要得到你想要的结果,可以手动检查下个月,然后添加下个月的天数。

    希望你能自己编写这段代码。我只是提供了具体的操作步骤。

    PHP 5.3的方法:
    为了获得正确的行为,你可以使用PHP 5.3引入的相对时间语句“first day of”。这个语句可以与“next month”、“fifth month”或“+8 months”结合使用,以前往指定月份的第一天。与你目前使用的“+1 month”相比,你可以使用以下代码来获得下个月的第一天:

    <?php
    $d = new DateTime( '2010-01-31' );
    $d->modify( 'first day of next month' );
    echo $d->format( 'F' ), "\n";
    ?>

    这个脚本将正确输出二月。当PHP处理这个下个月第一天的语句时,会发生以下情况:

    next month将月份(原始为1)增加1。这使得日期变成了2010-02-31。

    first day of将日期的天数设置为1,结果是日期变成了2010-02-01。

    Antwort
    0
  • StornierenAntwort