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

时间:2016-03-01 23:16:48

标签: php time

我有一个奇怪的问题,我在使用他们的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()的包装器,但它似乎是一种错综复杂的方法......

this question现有答案,但问题中没有提及时间组件(仅限日期),因此我不认为这个问题与该问题重复。此外,我主要是寻求改进我们处理此类问题的方式,而不一定是针对上述问题发布的解决方案。但是,如果我这样做是错的,那么欢迎你删除这个问题:(

2 个答案:

答案 0 :(得分:2)

2月没有31天,所以过剩的日子将推向前进。如果您将年份从2015年更改为2014年并再次执行代码,则可以检查效果。结果是2015-03-03(2015年2月有28天)

答案 1 :(得分:2)

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

$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);

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