Edit report at https://bugs.php.net/bug.php?id=60212&edit=1
ID: 60212 Comment by: anon at anon dot anon Reported by: reetz at krumedia dot de Summary: Unexpected behaviour while adding or subtracting relative time with strtotime Status: Open Type: Bug Package: Date/time related Operating System: Linux version 2.6.32-5-amd64 PHP Version: 5.3.8 Block user comment: N Private report: N New Comment: No matter how many times I see these reports, it still absolutely boggles my mind that so many PROGRAMMERS -- people you'd really think were capable of more sense, can't spot DAYLIGHT SAVING TIME even when it's staring them right in the face. Previous Comments: ------------------------------------------------------------------------ [2011-11-03 15:07:17] reetz at krumedia dot de Description: ------------ This problem only exists while using a time zone other than UTC, in my case "Europe/Berlin". I have to do relative time calculations and got an unexpected behaviour. I was "missing" one hour of data and some data was misplaced. First I assumed, I had forgotten an "UTC" or was using an "date" instead of "gmdate". Yet it was none of the former. As it turns out, strtotime is doing something extremely unexpected or even wrong. The output consists of five columns, each contains timestamps formatted with "d H:i \U\T\C" - sUnexpectedTimePrevious // minus one minute by strtotime - sTimePrevious // minus one minute as it should be - sTimeNow // - sTimeNext // plus one minute as it should be - sUnexpectedTimeNext // plus one minute by strtotime Lines with errors are marked with an exclamation marks. One line is of particular interest: ! 29 23:59 UTC | 30 00:59 UTC | 30 01:00 UTC | 30 01:01 UTC | 30 01:01 UTC Instead of one hour into the future it's now suddenly two one into the past. For the record, yes I had done a search before submitting this report. I found #54799 and #53370, yet I feel that the example I submitted might help analysing the problem. I am well aware that I could solve my problem by simply switching the default time zone to "UTC". But this is only solving a symptom, not the real problem. sincerely yours Michael Reetz Test script: --------------- //date_default_timezone_set('UTC'); // no problem date_default_timezone_set('Europe/Berlin'); // big problem $iCurrent = strtotime('2011-10-29 23:55:00 UTC'); $iEnd = strtotime('2011-10-30 01:05:00 UTC'); while ($iCurrent <= $iEnd){ $sTimeNow = gmdate('d H:i \U\T\C', $iCurrent ); $sTimePrevious = gmdate('d H:i \U\T\C', -60 + $iCurrent ); $sTimeNext = gmdate('d H:i \U\T\C', 60 + $iCurrent ); $sUnexpectedTimePrevious = gmdate('d H:i \U\T\C', strtotime('- 1 minute',$iCurrent)); $sUnexpectedTimeNext = gmdate('d H:i \U\T\C', strtotime('+ 1 minute',$iCurrent)); echo ($sUnexpectedTimePrevious != $sTimePrevious) ? '!':' '; echo " $sUnexpectedTimePrevious | $sTimePrevious | $sTimeNow | $sTimeNext | $sUnexpectedTimeNext "; echo ($sUnexpectedTimeNext != $sTimeNext) ? '!':' '; echo "\n"; $iCurrent += 60; } Expected result: ---------------- // created with : date_default_timezone_set('UTC'); 29 23:54 UTC | 29 23:54 UTC | 29 23:55 UTC | 29 23:56 UTC | 29 23:56 UTC 29 23:55 UTC | 29 23:55 UTC | 29 23:56 UTC | 29 23:57 UTC | 29 23:57 UTC 29 23:56 UTC | 29 23:56 UTC | 29 23:57 UTC | 29 23:58 UTC | 29 23:58 UTC 29 23:57 UTC | 29 23:57 UTC | 29 23:58 UTC | 29 23:59 UTC | 29 23:59 UTC 29 23:58 UTC | 29 23:58 UTC | 29 23:59 UTC | 30 00:00 UTC | 30 00:00 UTC 29 23:59 UTC | 29 23:59 UTC | 30 00:00 UTC | 30 00:01 UTC | 30 00:01 UTC 30 00:00 UTC | 30 00:00 UTC | 30 00:01 UTC | 30 00:02 UTC | 30 00:02 UTC 30 00:01 UTC | 30 00:01 UTC | 30 00:02 UTC | 30 00:03 UTC | 30 00:03 UTC [.. skipped several lines ..] 30 00:57 UTC | 30 00:57 UTC | 30 00:58 UTC | 30 00:59 UTC | 30 00:59 UTC 30 00:58 UTC | 30 00:58 UTC | 30 00:59 UTC | 30 01:00 UTC | 30 01:00 UTC 30 00:59 UTC | 30 00:59 UTC | 30 01:00 UTC | 30 01:01 UTC | 30 01:01 UTC 30 01:00 UTC | 30 01:00 UTC | 30 01:01 UTC | 30 01:02 UTC | 30 01:02 UTC 30 01:01 UTC | 30 01:01 UTC | 30 01:02 UTC | 30 01:03 UTC | 30 01:03 UTC 30 01:02 UTC | 30 01:02 UTC | 30 01:03 UTC | 30 01:04 UTC | 30 01:04 UTC 30 01:03 UTC | 30 01:03 UTC | 30 01:04 UTC | 30 01:05 UTC | 30 01:05 UTC 30 01:04 UTC | 30 01:04 UTC | 30 01:05 UTC | 30 01:06 UTC | 30 01:06 UTC Actual result: -------------- // created with : date_default_timezone_set('Europe/Berlin'); 29 23:54 UTC | 29 23:54 UTC | 29 23:55 UTC | 29 23:56 UTC | 29 23:56 UTC 29 23:55 UTC | 29 23:55 UTC | 29 23:56 UTC | 29 23:57 UTC | 29 23:57 UTC 29 23:56 UTC | 29 23:56 UTC | 29 23:57 UTC | 29 23:58 UTC | 29 23:58 UTC 29 23:57 UTC | 29 23:57 UTC | 29 23:58 UTC | 29 23:59 UTC | 29 23:59 UTC 29 23:58 UTC | 29 23:58 UTC | 29 23:59 UTC | 30 00:00 UTC | 30 01:00 UTC ! 29 23:59 UTC | 29 23:59 UTC | 30 00:00 UTC | 30 00:01 UTC | 30 01:01 UTC ! ! 30 01:00 UTC | 30 00:00 UTC | 30 00:01 UTC | 30 00:02 UTC | 30 01:02 UTC ! ! 30 01:01 UTC | 30 00:01 UTC | 30 00:02 UTC | 30 00:03 UTC | 30 01:03 UTC ! [.. skipped several lines ..] ! 30 01:57 UTC | 30 00:57 UTC | 30 00:58 UTC | 30 00:59 UTC | 30 01:59 UTC ! ! 30 01:58 UTC | 30 00:58 UTC | 30 00:59 UTC | 30 01:00 UTC | 30 02:00 UTC ! ! 29 23:59 UTC | 30 00:59 UTC | 30 01:00 UTC | 30 01:01 UTC | 30 01:01 UTC 30 01:00 UTC | 30 01:00 UTC | 30 01:01 UTC | 30 01:02 UTC | 30 01:02 UTC 30 01:01 UTC | 30 01:01 UTC | 30 01:02 UTC | 30 01:03 UTC | 30 01:03 UTC 30 01:02 UTC | 30 01:02 UTC | 30 01:03 UTC | 30 01:04 UTC | 30 01:04 UTC 30 01:03 UTC | 30 01:03 UTC | 30 01:04 UTC | 30 01:05 UTC | 30 01:05 UTC 30 01:04 UTC | 30 01:04 UTC | 30 01:05 UTC | 30 01:06 UTC | 30 01:06 UTC ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=60212&edit=1