2015-10-05 85 views
0

我正在嘗試創建日曆,其中日期遞增,並且每個日期都是可點擊的,鏈接到搜索。奇怪的部分是日期停止在25th October,並停止遞增。即24th, 25th, 25th, 25th...PHP日期遞增錯誤

無論哪一天日曆開始(一直盯着它幾天),但在25th it stops incrementing。 。

感謝您的任何意見(後間隙的第二部分可能是無關緊要的,但包括它的情況下,有可能是任何一個環節)

for ($i = 1; $i <= 30; $i++){ 
    $date = date("d-m-Y", strtotime($date) + 86400); 
    array_push($array_date, $date); 
    $separatedate = explode('-', $date); 
    $getday = date("l", strtotime($date)); 
    print "<button class='submitsearch btn' value=$array_date[$i]>" . ltrim($separatedate[0], '0') . "<br>" . $getday . "<br></button>"; 

    if (!checkdate($separatedate[1] , $separatedate[0]+1 , $separatedate[2])) { 
     $nextmonth = date("F", strtotime($date) + 86400); 
     print "<strong>". $nextmonth . "</strong><hr/>"; 
    } 
} 

回答

3

這就是問題所在:

$date = date("d-m-Y", strtotime($date) + 86400); 

你似乎依靠這個來增加日期。通常情況下,這很好......但由於夏時制時間的變化,我們每天有25小時不是這樣。

我建議您使用日期/時間算術函數(例如date_add),旨在添加一天而不是添加24小時。或者確保全部算術是在UTC中完成的,它不會有任何時區更改。一般來說,我會盡量避免執行比您真正需要的任何更多的字符串轉換:以慣用方式保留代表日期/時間的變量,並對其執行算術運算 - 然後只需格式即可。如果你這樣做,我認爲沒有必要在任何地方撥打strtotime

+1

或者只是使用'strtotime($ date。「+ 1 day」)' – Ben

+0

@BenPearlKahan:可能,但我通常會建議從混音中刪除字符串轉換時,他們不需要。像這樣格式化和解析是一個非常糟糕的主意,IMO。 –

+0

謝謝Jon!和本貢獻。給Jon指出問題的功勞。對於那些想知道實現的最終解決方案,我用創建一個新的DateTime對象替換了困擾的行:$ date = new DateTime($ date); $ date - >(new DateInterval('P1D'); $ date = $ date-> format('d-m-Y');用於與其他代碼集成:) – lorry