搜索

首页  >  问答  >  正文

PHP DateTime::modify 方法可以用来添加和减去月份。

<p>我一直在大量使用DateTime类,最近在添加月份时遇到了一个我认为是错误的问题。经过一些研究,发现这实际上不是一个错误,而是按照预期的方式工作。根据在这里找到的文档:</p> <blockquote> <p>Example #2 Beware when adding or subtracting months</p> </blockquote> <pre class="brush:php;toolbar:false;"><?php $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"; ?></pre> <blockquote> <pre class="brush:php;toolbar:false;">The above example will output: 2001-01-31 2001-03-03</pre> </blockquote> <p>有人能解释为什么这不被视为一个错误吗?<br /><br />此外,有人有什么优雅的解决方案来纠正这个问题,使得+1个月能按预期工作,而不是按设计意图工作吗?</p><p><br /></p>
P粉046387133P粉046387133520 天前619

全部回复(2)我来回复

  • 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

    回复
    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。

    回复
    0
  • 取消回复