2014-12-05 36 views
0

所以,我正在減去相對的月份。根據文檔:PHP相對月沒有產生預期結果

相對月份值是根據它們經過的月份的長度計算的。一個例子是「2011年2月30日+2月」,這將產生「2012-01-30」。這是由於11月份爲30天,而12月份爲31天,共計61天。

我明白了爲什麼例如添加個月的時候,但我不明白爲什麼2014-12-31 -1 month產生2014-12-01。在12月的31天裏,不應該是11月的最後一天?

示例代碼。功能1產生的結果我是從功能2和3的預期

//Func 1 
$date = '2014-12-31 23:59:59'; //YYYY-MM-DD 
$days = 0; 
echo $date.'<br>'; 
for ($i = 1; $i < 13; $i++) { 
    $days += cal_days_in_month(CAL_GREGORIAN, (13-$i), 2014); 
    echo date("Y-m-d H:i:s", strtotime("-$days days", strtotime($date))).'<br>'; 
} 
echo "<br><br>"; 
//Func 2 
$date = '2014-12-31 23:59:59'; //YYYY-MM-DD 
echo $date.'<br>'; 
for ($i = 1; $i < 13; $i++) { 
    echo date("Y-m-d H:i:s", strtotime("-$i months", strtotime($date))).'<br>'; 
} 
//Func 3 
echo "<br><br>"; 
$dateObj = new DateTime("2014-12-31 23:59:59"); 
echo $dateObj->format("Y-m-d H:i:s").'<br>'; 
$dateIntervalObj = new DateInterval("P1M"); 
for ($i = 0; $i < 12; $i++) { 
    echo $dateObj->format("Y-m-d H:i:s").'<br>'; 
    $dateObj->sub($dateIntervalObj); 
} 

結果:

2014-12-31 23:59:59 
2014-11-30 23:59:59 
2014-10-31 23:59:59 
2014-09-30 23:59:59 
2014-08-31 23:59:59 
2014-07-31 23:59:59 
2014-06-30 23:59:59 
2014-05-31 23:59:59 
2014-04-30 23:59:59 
2014-03-31 23:59:59 
2014-02-28 23:59:59 
2014-01-31 23:59:59 
2013-12-31 23:59:59 


2014-12-31 23:59:59 
2014-12-01 23:59:59 
2014-10-31 23:59:59 
2014-10-01 23:59:59 
2014-08-31 23:59:59 
2014-07-31 23:59:59 
2014-07-01 23:59:59 
2014-05-31 23:59:59 
2014-05-01 23:59:59 
2014-03-31 23:59:59 
2014-03-03 23:59:59 
2014-01-31 23:59:59 
2013-12-31 23:59:59 


2014-12-31 23:59:59 
2014-12-31 23:59:59 
2014-12-01 23:59:59 
2014-11-01 23:59:59 
2014-10-01 23:59:59 
2014-09-01 23:59:59 
2014-08-01 23:59:59 
2014-07-01 23:59:59 
2014-06-01 23:59:59 
2014-05-01 23:59:59 
2014-04-01 23:59:59 
2014-03-01 23:59:59 
2014-02-01 23:59:59 

回答

0

似乎總是圍捕:

2014-10-31 +1 month => 2014-12-01 // this makes sense 
2014-12-31 -1 month => 2014-12-01 // this doesn't 
在這兩種情況下

如果一天不不存在,它使用後一天。

+1

爲什麼這看起來超級怪異2014-03-31 23:59:59 -1 month => 2014-03-03 23:59:59'? – user3332631 2014-12-05 05:50:59

+0

哦,很好,很好的想法!看起來像現在的PHP中的錯誤 - 如果日期不存在,他們將缺少的天數添加到下個月的開始並使用它。所以如果沒有31,使用1st。如果沒有30號或29號,請使用第2號?這不再有意義。 – Andras 2014-12-05 05:58:36

+0

這不是一個錯誤。這就是PHP開發人員決定如何處理這個問題的方式。無論如何,這樣做對某人來說是錯誤的。 – vascowhite 2014-12-05 06:05:21

相關問題