2016-03-01 110 views
0

我有一个奇怪的问题,我从来没有遇到过使用它们的strtotime()函数之前的PHP。需要关于PHP strtotime()计算错误的建议

$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

因为一个月不是一个固定的长度...... PHP不会给你“两个月后的月份的最后一天”,它需要一个任意月份的长度,在大多数情况下(但不是全部)情况下....如果你想要的话,在本月的第一天增加2个月,然后请求该月的最后一个日期 –

回答

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

不是最漂亮的解决方案,但它的工作原理。

+0

对不起,如果这听起来很粗鲁,但我们不是你的个人编码军队,所以如果你收到工作解决方案,接受并自行改进。日期计算在PHP中有点麻烦,所以这个问题不是一个简单的解决方案:http://stackoverflow.com/questions/14584115/php-strtotime-1-month-adding-an-extra-month – Tyr

2

二月份没有31天,所以溢出的日子将会推进到3月。您可以检查效果,如果您更改并且再次执行该代码,结果为2015-03-03(2015年2月有28天)