我有一个奇怪的问题,我在使用他们的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现有答案,但问题中没有提及时间组件(仅限日期),因此我不认为这个问题与该问题重复。此外,我主要是寻求改进我们处理此类问题的方式,而不一定是针对上述问题发布的解决方案。但是,如果我这样做是错的,那么欢迎你删除这个问题:(
答案 0 :(得分:2)
答案 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);
不是最漂亮的解决方案,但它确实有效。