2016-03-01 58 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天)