PHP DateTime差异奇怪的结果

时间:2012-02-23 15:57:29

标签: php datetime

我在使用PHP的DateTime diff方法时遇到了一个奇怪的问题。我现在一直在使用DateTime方法,并认为我已经掌握了它,但这个问题让我感到惊讶。

我使用diff方法确定两个日期之间的月/天数。 今天,我使用了以下代码:

$start = new DateTime('2012-03-01');
$end = new DateTime('2012-03-31');

$period = $start->diff($end);

var_dump($period);

产生了以下输出:

object(DateInterval)[3]
  public 'y' => int 0
  public 'm' => int 1 // Shouldn't this be 0?
  public 'd' => int 1 // And where does this come from? Would expect 30.
  public 'h' => int 0
  public 'i' => int 0
  public 's' => int 0
  public 'invert' => int 0
  public 'days' => int 30

正如我上面的评论所说,1m1d来自哪里(我预计0m30d)。我不能为我的生活弄清楚它从哪里获得这个价值。我也尝试将午夜时间戳00:00:00置于两个日期之后,以确保它不是时间问题,但这对输出没有任何影响。

有人可以向我解释这个结果吗? 我的Debian开发服务器上出现此问题,运行PHP 5.3.3并安装Xdebug 2.1.1和Suhosin 0.9.32.1。

更新

在我的生产服务器上重现了这个问题,该服务器在CentOS 6.0上,带有“原始”PHP 5.3.8,没有任何扩展/补丁。

更新2

我设法找到了“解决方法”(仅在此时工作)。如果我将绝对日期更改为:

$start = new DateTime('first day of next month');
$end = new DateTime('last day of next month');

确实输出0m30d。尽管如此,我仍然对上述事情感到困惑,所以如果有人对此有所了解,请告诉我!

3 个答案:

答案 0 :(得分:4)

恭喜,您刚刚发现夏令时!如果您使用DST切换检查您的时区,您会看到$ start实际上是2月29日,而$ end是3月30日。 (2-3)= 1(因此,m = 1),(29-30)= 1(因此,d = 1)。

答案 1 :(得分:1)

我得到的结果与你不一样,我的结果确实没问题......

object(DateInterval)#3 (8) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(0)
  ["d"]=>
  int(30)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  int(30)
}

获得1个月不正常导致ISNT即使在两个日期之间还有一个月,1个月将是

$start = new DateTime('2012-03-01');
$end = new DateTime('2012-04-01');

我在这里看到的是你可能有-1天1个月而不是30天你认为你看到1天1个月,或者你得到的代码不是你在这里粘贴的......

你能开导我们吗?

由于

答案 2 :(得分:0)

this页面上的评论(PHP手册)似乎表明该功能在某些平台或某些输入范围内可能非常错误。

这可能是导致问题的原因。