需要有关 PHP strtotime() 计算错误的建议


Need advice for PHP strtotime() calculation errors

我有一个奇怪的问题,我以前在使用他们的strtotime()函数时从未遇到过PHP。

$original = strtotime('2015-12-31 12:34:56');
$time = strtotime('+ 2 month', $original);
echo date('m/d/y H:i:s', $original),'<br>',date('m/d/y H:i:s', $time);

我希望得到什么作为输出:

12/31/15 12:34:56
02/29/16 12:34:56

我实际得到的输出:

12/31/15 12:34:56
03/02/16 12:34:56

如何解释此计算错误?经过相当多的调查,我意识到PHP平均使用30.5天来进行这样的计算。 我真的不太关心这种情况的"为什么",而是我能做些什么来解释它。 我想到了一些想法,涉及在涉及月份计算时为 strtotime() 编写包装器,但这似乎是一种复杂的方法......

这个问题有一个现有的答案,但问题中没有提到时间部分(只有一个日期),因此我不认为这个问题是那个问题的答案的副本。 此外,我主要是寻求改进我们处理此类问题的方式,不一定是针对上述问题的解决方案。 但是,如果我这样做是错误的,那么欢迎您删除此问题:(

如果你想得到最后的日期,你可以用另一种方式使用这种溢出/下溢的行为:

$original = new DateTime('2015-12-31');
$modified = clone $original;
$modified->modify('+2 months');
$modified->setDate($modified->format('Y'), $modified->format('m'), 0);
echo $original->format('m/d/y H:i:s') . "<br>" .$modified->format('m/d/y H:i:s');

或更简单

$date = explode('-', '2015-12-31');
$modified = new DateTime();
$modified->setDate($date[0], $date[1]+3, 0);

不是最漂亮的解决方案,但它有效。

二月没有31天,所以溢出的日子将推迟到三月。如果将年份从 2015 更改为 2014 并再次执行代码,则可以检查效果。结果是 2015-03-03 (二月有 28 天在 2015