2013-10-31 108 views
4

看一看這段代碼:PHP日期間隔 - 錯月的差異

$first = DateTime::createFromFormat('Y-m', '2001-07'); 
    $last = DateTime::createFromFormat('Y-m', '1998-06'); 
    $interval = $first->diff($last); 
    echo "m diff: ".$interval->m." y diff: ".$interval->y."\n"; 

輸出爲米DIFF:0 Y,DIFF:3

爲什麼它返回一個錯誤月的差異?

有趣的是,如果我將日期更改爲'2001-08'和'1998-07',它會返回正確的月份間隔== 1。

謝謝!

+0

如果您添加一天(如'2001-07-01'和'1998-06-01',格式爲'Ymd' –

+0

會發生什麼?不能這樣做,因爲我從數據庫中獲取日期,並且它可能包含在我的情況下,這一天是無關緊要的 - 只有一個月的差異是重要的 – user2723490

回答

8

PHP DateTime不處理不完整的日期時間。

DateTime::createFromFormat('Y-m', '2011-07')給出了一個DateTime具有2011年的,7月和日,小時,分鐘,距離當前時間(採取在我寫這篇文章的那一刻第二2011-07-31 18:05:47

同樣地,DateTime::createFromFormat('Y-m', '1998-06')給出的DateTime的年份爲1998年,6個月,以及從當前時間開始的一天,一小時,一分鐘和二秒。自6月31日起不存在日期,結果爲1998-07-01 18:05:47(31天后6月1日前一天)

兩個日期是3年,0個月和30天。

在你的2001-081998-07例如,這兩個月正好有31天,所以算算出來正確。這個bug是難以確定的,因爲它取決於代碼是運行的日期,儘管它看起來並不明顯。

你也許可以通過使用"Y-m-d H:i:s"的格式,並追加"-01 00:00:00"給你傳遞給createFromFormat每個日期,這將錨DateTime你回到月初修復你的代碼。

+1

+1擊敗了我 –

+1

謝謝,我已經在挖掘到區間對象之後意識到它了,它似乎是更容易計算與「Ym」直接相差的月份差異($ y1 * 12 + $ m1) - ($ 2 * 12 + $ m2) – user2723490

+0

@ user2723490,這似乎也很合理。我沒有看到任何非12個月在可預見的未來幾年:) – hobbs