2015-02-05 108 views
6

如果我用這個代碼中,我得到了奇怪的結果:PHP二月份日期:「2015-01-31」+1個月:「2015-03-30」。怎麼修?

$datetime = new DateTime('2015-01-31'); 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 

我得到這個:

2015-03-31 
2015-04-30 
2015-05-31 

而且不2015-02-28

如何解決?

+0

@all:是THI是一個真正的bug?這顯然打破了可用性,並明確地破壞了大量的應用程序。 – Sliq 2015-02-05 19:09:56

回答

0

如果你想獲得下個月的最後一天,你可以使用:

$datetime->modify('last day of next month'); 
0

修復它這樣。

$datetime = new DateTime('2015-01-31'); 
$datetime->modify('28 days'); 
echo $datetime->format('Y-m-t') . "<br>"; 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 
$datetime->modify('+1 month'); 
echo $datetime->format('Y-m-t') . "<br>"; 

你會得到

2015-02-28 
2015-03-31 
2015-04-30 
+2

你是天才,真的!天才!!!天才!!! – 2015-02-05 18:36:31

+0

不是真的..這通常不起作用。只有當你已經知道你在處理1月份的時候,那麼,爲什麼要使用'DateTime'讓你到2月份呢?選擇一個總是有效的簡單解決方案,總是看起來一樣,就像mopo發佈一樣。 – 2015-02-05 18:56:25

+0

當我說你是天才時,我在開玩笑。 – 2015-02-05 20:15:52

3

的方式DateTime作品,+ 1 month增加1月份值,讓您2015-02-31。由於二月份只有28天或29天,因此將評估到3月的前幾天。然後,如你所知,詢問Y-m-t會給你三月的最後一天。

既然你已經使用t拿到這個月的最後一天,你可以通過避免這個問題開始與下降在本月開始,而不是一個日期:

$datetime = new DateTime('2015-01-01'); 

參考:PHP DateTime::modify adding and subtracting months

0

你可以試試這個功能個月添加到DateTime對象

/** 
* 
* @param \DateTime $date DateTime object 
* @param int $monthToAdd Months to add at time 
*/ 
function addMonth(\DateTime $date, $monthToAdd) 
{ 
    $year = $date->format('Y'); 
    $month = $date->format('n'); 
    $day = $date->format('d'); 

    $year += floor($monthToAdd/12); 
    $monthToAdd = $monthToAdd % 12; 
    $month += $monthToAdd; 
    if ($month > 12) { 
     $year ++; 
     $month = $month % 12; 
     if ($month === 0) { 
      $month = 12; 
     } 
    } 

    if (! checkdate($month, $day, $year)) { 
     $newDate = \DateTime::createFromFormat('Y-n-j', $year . '-' . $month . '-1'); 
     $newDate->modify('last day of'); 
    } else { 
     $newDate = \DateTime::createFromFormat('Y-n-d', $year . '-' . $month . '-' . $day); 
    } 
    $newDate->setTime($date->format('H'), $date->format('i'), $date->format('s')); 

    return $newDate->format('Y-m-d'); 
} 

echo addMonth(new \DateTime('2015-01-30'), 1); //2015-02-28 
echo addMonth(new \DateTime('2015-01-30'), 2); //2015-03-30 
echo addMonth(new \DateTime('2015-01-30'), 3); //2015-04-30