,我們要添加或。減去1秒考慮以下代碼:strtotime()有bug嗎?
date_default_timezone_set("Europe/Amsterdam");
$time = 1477789199;
echo $time . ' - ' . date('r', $time) . "\n";
// 1477789199 - Sun, 30 Oct 2016 02:59:59 +0200
這是正確的,因爲這時間戳仍然只是內DST(夏令時間/夏令時間)。
但現在,讓我們1秒添加時間戳整數,退出 DST:
$new = $time + 1;
echo $new . ' - ' . date('r', $new);
// 1477789200 - Sun, 30 Oct 2016 02:00:00 +0100
萬歲! PHP看到一秒鐘後就沒有DST了,並顯示一個合適的時間字符串。
但是,如果我們沒有添加第二個到時間戳的整數,但我們用strtotime()
加那一秒:
$new = strtotime('+1 second', $time);
echo $new . ' - ' . date('r', $new);
// 1477792800 - Sun, 30 Oct 2016 03:00:00 +0100
哎呀!我們剛剛超過一小時而不是一秒鐘。而且,如果您添加一秒鐘,一小時,一天或一年,則無需擔心,您將永遠得到一小時的額外時間。即使你添加多個年,你只會得到一個額外的一小時,因爲我們進入這是怪異和出口每年夏令時,但你只能得到不管你有多少年添加
一個額外的時刻,但是,一旦我們退出在十月的DST和減去一秒,一切順利...
但是再次。如果我們在3月份,剛剛進入夏令時,我們減去一秒鐘,我們觀察到完全相同的情況。
等等,什麼?!那麼......?
echo strtotime('+ 1 second - 1 second', 1477789199); // echoes 1477792799
哇......
對我來說,這聽起來像一個錯誤。或者這是'按設計'?有人甚至知道這是否記錄在某處,或者是否需要報告?
糟糕。如果我在發佈之前檢查了PHP bug池,我會在2012年發現一個類似的問題,並且沒有進行跟進:https://bugs.php.net/bug.php?id=62185 –
從[doc]( http://php.net/manual/en/function.strtotime.php):'不建議使用這個函數進行數學運算。最好在PHP 5.3及更高版本中使用DateTime :: add()和DateTime :: sub(),或者在PHP 5.2中使用DateTime :: modify()。 ' –
報告於https://bugs.php.net/bug.php?id=73138 –