猿问

PHP DateTime ::修改添加和减去月份

我一直在努力工作,DateTime class并且最近遇到了我认为添加月份时的错误。经过一些研究后,似乎它不是一个bug,而是按预期工作。根据此处的文档:


示例#2在添加或减去月份时要小心


<?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";

?>

The above example will output:

2001-01-31

2001-03-03

任何人都可以证明为什么这不被视为错误?


此外,是否有人有任何优雅的解决方案来纠正问题并使其成为+1个月将按预期工作而不是按预期工作?


catspeake
浏览 485回答 3
3回答

呼啦一阵风

这可能很有用:echo Date("Y-m-d", strtotime("2013-01-01 +1 Month -1 Day"));&nbsp; // 2013-01-31echo Date("Y-m-d", strtotime("2013-02-01 +1 Month -1 Day"));&nbsp; // 2013-02-28echo Date("Y-m-d", strtotime("2013-03-01 +1 Month -1 Day"));&nbsp; // 2013-03-31echo Date("Y-m-d", strtotime("2013-04-01 +1 Month -1 Day"));&nbsp; // 2013-04-30echo Date("Y-m-d", strtotime("2013-05-01 +1 Month -1 Day"));&nbsp; // 2013-05-31echo Date("Y-m-d", strtotime("2013-06-01 +1 Month -1 Day"));&nbsp; // 2013-06-30echo Date("Y-m-d", strtotime("2013-07-01 +1 Month -1 Day"));&nbsp; // 2013-07-31echo Date("Y-m-d", strtotime("2013-08-01 +1 Month -1 Day"));&nbsp; // 2013-08-31echo Date("Y-m-d", strtotime("2013-09-01 +1 Month -1 Day"));&nbsp; // 2013-09-30echo Date("Y-m-d", strtotime("2013-10-01 +1 Month -1 Day"));&nbsp; // 2013-10-31echo Date("Y-m-d", strtotime("2013-11-01 +1 Month -1 Day"));&nbsp; // 2013-11-30echo Date("Y-m-d", strtotime("2013-12-01 +1 Month -1 Day"));&nbsp; // 2013-12-31

至尊宝的传说

这是另一个完全使用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-312012-02-29

慕侠2389804

为什么它不是一个bug:目前的行为是正确的。内部发生以下情况:+1 month将月份数(原来为1)增加1。这就是约会2010-02-31。第二个月(二月)在2010年只有28天,所以PHP自动更正了这一点,只是继续计算从2月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";?>此脚本将正确输出February。当PHP处理此first day of next month节时,会发生以下情况:next month将月份数(原来为1)增加1。这使得日期为2010-02-31。first day of将日期编号设置为1,导致日期为2010-02-01。
随时随地看视频慕课网APP
我要回答