2017-05-31 32 views
0

當我在5月(31日)的最後一天執行以下操作時,發生了一些奇怪的行爲。如果我將系統時間更改爲5月30日或6月(30日)的最後一天,則它的功能正常。在31天月底調用DateTime時發生月份重複

由於某些原因,但在31日,它將跳過下個月(6月),而是將其替換爲7月份。所以它會輸出7月兩次。下面是一個例子:其產生上述

<?php 
$datepicker_month_range = 3; 

// create an array of dates for a number of months specified by the user. 0 is used for this month 
for ($month = 0; $month <= $datepicker_month_range; $month++) { 
    $dt_dates = new DateTime(); 
    $dt_dates->add(new DateInterval("P{$month}M")); // example, P1M == plus 1 month 
    $days_in_month = cal_days_in_month(CAL_GREGORIAN, $dt_dates->format('m'), $dt_dates->format('Y')); 

    echo $days_in_month." days in ".$dt_dates->format('m').", "; 

    for ($day = 1; $day <= $days_in_month; $day++) { 
    $date = $dt_dates->format('Y')."-".$dt_dates->format('m')."-".sprintf('%02d', $day); // leading zeros 05-.. 
    $month_days[] = $date; 
    } 
} 
//print_r($month_days); 
?> 

稍後,如果運行print_r($month_days),完整的日期被輸出與七月輸出兩次像在前面的表達式

31 days in 05, 31 days in 07, 31 days in 07, 31 days in 08, 

代碼。

是什麼導致了這種行爲?

謝謝。

+2

[見例如#3:添加個月時提防](http://php.net/manual/en/datetime.add.php#refsect1-datetime。添加示例) –

+1

這是添加月份時的預期行爲。如果日期是「5月31日」,並且您添加了1個月,則它會將月份值從「05」增加到「06」,但這一天保持不變。由於沒有「31-Jun」,那麼就會翻到「01-Jul」。所有的日期/時間函數將「翻轉」這樣的無效值。 '40-Jun'被認爲是'6月最後一天過後的10天',並將轉到'7月10日'。 –

+0

謝謝,我現在看到問題了。我想更簡單的修復方法是將日期回滾到1st,然後修改依賴於當前日期的後續代碼。 – user3442612

回答

0

好了,看完後評論,似乎這是PHP DateTime::modify adding and subtracting months

重複,但這裏是我周圍的問題是如何得到。

$month_beginning = $dt_dates->format('Y-m-01'); 
$dt_dates = new DateTime($month_beginning); // rollback the date to the first so we can increment months safely 

總之

for ($month = 0; $month <= $datepicker_month_range; $month++) { 
    $dt_dates = new DateTime(); 
    $month_beginning = $dt_dates->format('Y-m-01'); 
    $dt_dates = new DateTime($month_beginning); // rollback the date to the first so we can increment months safely 
    $dt_dates->add(new DateInterval("P{$month}M")); // P1M == plus 1 month 
    $days_in_month = cal_days_in_month(CAL_GREGORIAN, $dt_dates->format('m'), $dt_dates->format('Y')); 
    //echo $days_in_month." days in ".$dt_dates->format('m').", "; 
    for ($day = 1; $day <= $days_in_month; $day++) { 
    $date = $dt_dates->format('Y')."-".$dt_dates->format('m')."-".sprintf('%02d', $day); // leading zeros 05-.. 
    $month_days[] = $date; // holds dates for datepicker month ranges 
    } 
}