先来看一段代码:
<?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, 下面我会进行逐步的说明.
在增加月份时内部的操作是这样的:
2001-01-31
执行操作+1 month
增加了1个月. 这使得日期变为了2001-02-31
.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
.