php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #40937 date() and dst update
Submitted: 2007-03-28 15:21 UTC Modified: 2007-04-16 14:27 UTC
From: ctrlaltca at libero dot it Assigned:
Status: Not a bug Package: Date/time related
PHP Version: 5.2.1 OS: Slackware Linux
Private report: No CVE-ID: None
 [2007-03-28 15:21 UTC] ctrlaltca at libero dot it
Description:
------------
It seems that the date() function "jumps over" sundays when converting timestamps not referring to midnight.
Similar to #461


Reproduce code:
---------------
<?php
$day=date("j");
$mo=date("n");
$year=date("Y");

for($i=6; $i>=0; $i--)
{
        $a=mktime(0, 0, 0, $mo,$day, $year);
        $b=date("r",$a);
        $c=strtotime($b. "-" . $i . " day");
        $curdate=date("Ymd",$c);

        $d=date("r");
        $e=strtotime($d. "-" . $i . " day");
        $curdate2=date("Ymd",$e);
        echo "\n|".$b."=".$d."|".$c."=".$e."|".$curdate."=".$curdate2."|";

}
?>

Expected result:
----------------
I expect this script to return the right "Ymd" dates of the last seven days.

Actual result:
--------------
It works:
|Wed, 28 Mar 2007 00:00:00 +0200=Wed, 28 Mar 2007 17:13:37 +0200|1175032800=1175094817|20070328!=20070328|
but when it finds a sunday, dates are shifted off of 1 day:
|Wed, 28 Mar 2007 00:00:00 +0200=Wed, 28 Mar 2007 17:13:37 +0200|1174773600=1174835617|20070324!=20070325|




Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2007-03-28 19:11 UTC] derick@php.net
We are happy to tell you that you just discovered Daylight Savings
Time. For more information see:
http://webexhibits.org/daylightsaving/b.html
Instead of using mktime/date consider using gmmktime and gmdate which do
not suffer from DST.

Try this script instead, that also shows the time to see what's happening:

<?php
$day=date("j");
$mo=date("n");
$year=date("Y");

for($i=6; $i>=0; $i--)
{
        $a=mktime(0, 0, 0, $mo,$day, $year);
        $b=date("r",$a);
        $c=strtotime($b. "-" . $i . " day");
        $curdate=date("Ymd His",$c);

        $d=date("r");
        $e=strtotime($d. "-" . $i . " day");
        $curdate2=date("Ymd His",$e);
        echo
"\n|".$b."=".$d."|".$c."=".$e."|".$curdate."=".$curdate2."|";

}
?>

 [2007-03-31 17:49 UTC] ctrlaltca at libero dot it
First, thank you for the reply.

I tried the script:
|Sat, 31 Mar 2007 00:00:00 +0000=Sat, 31 Mar 2007 17:18:59 +0000|1174780800=1174843139|20070324 230000=20070325 171859|

I understand that strtotime($d. "-1 day") is an alias for "-24 hours", and dst handling routines adds one more hour to compensate.
Afaik summer time begins and ends at 1:00 a.m. Universal Time (GMT) in Europe, and at 2:00 a.m. localtime in the US. Other states do it at midnight (example: Chile).
Trying this other script it seems that php updates the time at midnight:

<?php
$day=24;
$mo=03;
$year=2007;

for($i=0; $i<=7; $i++)
{
        $a=mktime(22, 0, 0, $mo,$day, $year);
        $b=date("r",$a);
        $c=strtotime($b. "+" . $i . " hour");
        $curdate=date("Ymd His",$c);

        echo "\n|".$b."|".$c."|".$curdate."|";
}
echo "\n";
?>

Do all we live in Chile? :) Or am i wrong again? 
Thank you again for your comment, i'll use gm* class of functions.
 [2007-03-31 17:51 UTC] ctrlaltca at libero dot it
sorry, i forgot to update bug summary
 [2007-04-03 18:52 UTC] derick@php.net
What does the following output:

echo date_default_timezone_get(), "\n";

 [2007-04-04 09:47 UTC] ctrlaltca at libero dot it
root@tiamat:~# php -r "echo date_default_timezone_get();"
Europe/Berlin

It's an alias for GMT+1
 [2007-04-11 14:06 UTC] derick@php.net
I get the following correct output:
|Sat, 24 Mar 2007 22:00:00 +0100|1174770000|20070324 220000 +0100 CET|
|Sat, 24 Mar 2007 22:00:00 +0100|1174773600|20070324 230000 +0100 CET|
|Sat, 24 Mar 2007 22:00:00 +0100|1174777200|20070325 000000 +0100 CET|
|Sat, 24 Mar 2007 22:00:00 +0100|1174780800|20070325 010000 +0100 CET|
|Sat, 24 Mar 2007 22:00:00 +0100|1174784400|20070325 030000 +0200 CEST|
|Sat, 24 Mar 2007 22:00:00 +0100|1174788000|20070325 040000 +0200 CEST|
|Sat, 24 Mar 2007 22:00:00 +0100|1174791600|20070325 050000 +0200 CEST|
|Sat, 24 Mar 2007 22:00:00 +0100|1174795200|20070325 060000 +0200 CEST|

after modifying your date line to:
        $curdate=date("Ymd His O T",$c);

 [2007-04-16 13:36 UTC] ctrlaltca at libero dot it
I tried this script on other machines and it's working correctly as you said. Only my work pc was acting bad. Reformatted and reinstalled, now it's working right. It seems it was something corrupted on my pc. Sorry for wasting your time..
 [2007-04-16 14:27 UTC] derick@php.net
Okay, good to know. I will mark this bug as "Bogus" as it was not a bug in PHP.
 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Thu Jul 10 12:01:33 2025 UTC