我一直在努力工作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个月将按预期工作,而不是按预期工作?
发布于 2018-03-21 08:31:25
目前的行为是正确的。以下情况发生在内部:
+1 month
月份数(原为1)增加1。这使得日期2010-02-31
。要得到你想要的是:手动检查下个月。然后添加下个月的天数。
我希望你能自己编码。我只是在做什么。
为了获得正确的行为,你可以使用介绍相对时间节的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。发布于 2018-03-21 09:44:21
这可能有用:
echo Date("Y-m-d", strtotime("2013-01-01 +1 Month -1 Day"));
// 2013-01-31
echo Date("Y-m-d", strtotime("2013-02-01 +1 Month -1 Day"));
// 2013-02-28
echo Date("Y-m-d", strtotime("2013-03-01 +1 Month -1 Day"));
// 2013-03-31
echo Date("Y-m-d", strtotime("2013-04-01 +1 Month -1 Day"));
// 2013-04-30
echo Date("Y-m-d", strtotime("2013-05-01 +1 Month -1 Day"));
// 2013-05-31
echo Date("Y-m-d", strtotime("2013-06-01 +1 Month -1 Day"));
// 2013-06-30
echo Date("Y-m-d", strtotime("2013-07-01 +1 Month -1 Day"));
// 2013-07-31
echo Date("Y-m-d", strtotime("2013-08-01 +1 Month -1 Day"));
// 2013-08-31
echo Date("Y-m-d", strtotime("2013-09-01 +1 Month -1 Day"));
// 2013-09-30
echo Date("Y-m-d", strtotime("2013-10-01 +1 Month -1 Day"));
// 2013-10-31
echo Date("Y-m-d", strtotime("2013-11-01 +1 Month -1 Day"));
// 2013-11-30
echo Date("Y-m-d", strtotime("2013-12-01 +1 Month -1 Day"));
// 2013-12-31
https://stackoverflow.com/questions/-100003204
复制相似问题