PHP DateTime::modify 加减月份的问题
28 Jan 2015先来看一段代码:
<?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";
?>
这段代码输出为:
2001-01-31
2001-03-03
很奇怪, 2000-12-31
在增加了2个月后, 日期却变成了2001-03-03
, 这算是PHP的一个BUG么?
其实, 这并不是PHP的BUG, 下面我会进行逐步的说明.
这不是PHP的BUG
在增加月份时内部的操作是这样的:
- 对于
2001-01-31
执行操作+1 month
增加了1个月. 这使得日期变为了2001-02-31
. - 在2001年的2月只有28天, 因此PHP会从2月1日来继续计算日期以实现自动纠错. 因此结果变成了
2001-03-03
怎么得到期望结果
可以通过PHP 5.3的新特性: 相对时间first day of
来获得期望结果.
可以结合例如:next month
, fifth month
, +8 months
来获得指定月份的第一天.
代码如下:
<?php
$d = new DateTime( '2001-01-31' );
$d->modify( 'first day of next month' );
echo $d->format( 'F' ), "\n";
?>
这段代码会正确输出2月. PHP处理first day of next month
的流程是:
next month
将月份数字加1. 是时间变为2月31日.first day of
设置日期数字为1, 导致日期变为2001-02-01
.