奇怪的DateTime :: diff()结果

时间:2016-03-26 18:34:04

标签: php datetime

有人可以在下面的例子中解释DateTime :: diff()的结果:

$start = DateTime::createFromFormat('Y/m/d', '2013/05/11');
$end = DateTime::createFromFormat('Y/m/d', '2015/03/08');
$diff = $start->diff($end);
var_dump($diff);
exit;

结果:

object(DateInterval)#19 (15) {
  ["y"]=>
  int(1)
  ["m"]=>
  int(9)
  ["d"]=>
  int(25)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  int(666)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(0)
}

我认为这是在这里发生的事情: $ diff-> y为1,因为日期之间有一个完整年; $ diff-> m为9,因为日期之间有9个完整个月(没有2013/05和2015/03)。

我想知道如何计算25号。我无法弄清楚这个号码的来源。

我期待2013/05/11和2013/05/31 + 2015/03/01和2015/03/08之间的区别,所以20 + 7 = 27.相反,我得到25。

1 个答案:

答案 0 :(得分:1)

  

我认为这是在这里发生的:$ diff-> y是1,因为日期之间有一个完整的年; $ diff-> m为9,因为日期之间有9个完整个月(没有2013/05和2015/03)。

这个假设是正确的。

  

我期待2013/05/11和2013/05/31 + 2015/03/01 + 2015/03/08之间的差异,所以20 + 7 = 27。

这是相当容易混淆的写作,我花了一段时间才弄明白你的意思,但这就是为什么你不能指望......

您期望在2013/05/11(您的原始"来自"日期)和2015 / 02/11 之间有什么不同?正好一年9个月,对吧?

嗯,这是怎么回事 - 当的某一天匹配时,会达到一个月的差异。对于您所拥有的日期,2013/02/11是月差异计数从8增加到9的点,并且日期从上的开始计算

其余的很容易 - 二月(在那一年)有28天,所以你得到(28 - 11) + 8 = 25天。