Clark To Do The blog of Clark

PHP DateTime::modify 加减月份的问题

先来看一段代码:

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

在增加月份时内部的操作是这样的:

  1. 对于2001-01-31执行操作+1 month 增加了1个月. 这使得日期变为了2001-02-31.
  2. 在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的流程是:

  1. next month将月份数字加1. 是时间变为2月31日.
  2. first day of设置日期数字为1, 导致日期变为2001-02-01.
comments powered by Disqus