Heim > Fragen und Antworten > Hauptteil
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
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。