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