php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #68549 Timezones and offsets are not properly used when working with dates
Submitted: 2014-12-05 05:22 UTC Modified: 2014-12-05 05:33 UTC
Votes:7
Avg. Score:4.9 ± 0.3
Reproduced:7 of 7 (100.0%)
Same Version:1 (14.3%)
Same OS:2 (28.6%)
From: mfaust at usinternet dot com Assigned:
Status: Open Package: Date/time related
PHP Version: 5.6.3 OS: Linux
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: mfaust at usinternet dot com
New email:
PHP Version: OS:

 

 [2014-12-05 05:22 UTC] mfaust at usinternet dot com
Description:
------------
Unix timestamps are not respected during daylight savings transitions. When specifying a timestamp during a repeated hour, DateTime silently(incorrectly) modifies the timestamp to the previous hour.

In regards to the proposed https://wiki.php.net/rfc/datetime_and_daylight_saving_time change, there are some current behaviors in regards to the "fall back" repeated hour that sorely need to be addressed. For those that understand and need proper and accurate date/time handling it is crucial that these inconsistent behaviors are eliminated.


Test script:
---------------
//A timestamp indicates a fixed point in time, irregardless of timezone and daylight savings, so PHP must not change it when setting it:
$x = new DateTime();
$x->setTimezone(new DateTimezone('America/Chicago'));
$x->setTimestamp(1446357600);
echo $x->format('c') . "\n";

$x->setTimestamp(1446361200);
echo $x->format('c') . "\n"; //This should have a different offset since it's outside DST
echo $x->getTimestamp();

//Simpler example
$x = new DateTime();
$x->setTimezone(new DateTimezone('America/Chicago'));
$x->setTimestamp(1446361200);
echo $x->getTimestamp(); //Returns a different timestamp. No apparent way to specify a timestamp during the repeated hour.


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2014-12-05 05:33 UTC] yohgaki@php.net
http://3v4l.org/HGGjd

HHVM seems working correctly.
 [2015-03-06 16:06 UTC] bestcoder at ymail dot com
This is another test case showing that daylight saving time is poorly handled.

<?php
echo "Expected DateTime in ISO8601: 2014-10-26T02:00:00+0200
Expected DateTime in RFC850: Sunday, 26-Oct-14 02:00:00 GMT+0200
Expected Timestamp: 1414281600\n";
echo "--------------------------------------------\n";

$date = new \DateTime("2014-10-26T02:00:00+02:00");
$date->setTimeZone(new \DateTimeZone('Europe/Paris'));

echo "Actual DateTime in ISO8601: ", $date->format(\DateTime::ISO8601) ,"\n";
echo "Actual DateTime in RFC850: ", $date->format(\DateTime::RFC850) ,"\n";
echo "Actual timestamp: ", $date->getTimestamp() ,"\n";


echo "--------------------------------------------\n";
echo "--------------------------------------------\n";



echo "Expected DateTime in ISO8601: 2014-10-26T03:00:00+0200
Expected DateTime in RFC850: Sunday, 26-Oct-14 03:00:00 GMT+0200
Expected timestamp: 1414285200\n";
echo "--------------------------------------------\n";

$date = new \DateTime("2014-10-26T03:00:00+02:00");
$date->setTimeZone(new \DateTimeZone('Europe/Paris'));

echo "Actual DateTime in ISO8601: ", $date->format(\DateTime::ISO8601) ,"\n";
echo "Actual DateTime in RFC850: ", $date->format(\DateTime::RFC850) ,"\n";
echo "Actual timestamp: ", $date->getTimestamp() ,"\n";
?>

This scripts run on PHP 5.5.9 output :

Expected DateTime in ISO8601: 2014-10-26T02:00:00+0200
Expected DateTime in RFC850: Sunday, 26-Oct-14 02:00:00 GMT+0200
Expected Timestamp: 1414281600
--------------------------------------------
Actual DateTime in ISO8601: 2014-10-26T02:00:00+0200
Actual DateTime in RFC850: Sunday, 26-Oct-14 02:00:00 CEST
Actual timestamp: 1414285200
--------------------------------------------
--------------------------------------------
Expected DateTime in ISO8601: 2014-10-26T03:00:00+0200
Expected DateTime in RFC850: Sunday, 26-Oct-14 03:00:00 GMT+0200
Expected timestamp: 1414285200
--------------------------------------------
Actual DateTime in ISO8601: 2014-10-26T02:00:00+0100
Actual DateTime in RFC850: Sunday, 26-Oct-14 02:00:00 CET
Actual timestamp: 1414285200


So according to PHP 'Sunday, 26-Oct-14 02:00:00 CEST' and 'Sunday, 26-Oct-14 02:00:00 CET' refer to same timestamp '1414285200'  which is wrong. For 'Sunday, 26-Oct-14 02:00:00 CEST', it should show 1414281600.
 [2015-12-30 22:07 UTC] mj1856 at hotmail dot com
As seen here:  http://stackoverflow.com/q/34533604/634824

$date = new \DateTime("now", new \DateTimeZone("UTC"));
$date->setTimestamp(1540686600);
echo $date->getTimestamp() . "\n";  //1540686600
echo $date->format('c') . "\n";     //2018-10-28T00:30:00+00:00

This is wrong, as the timestamp corresponds to 1:30:00+01:00

Additionally,
$date->setTimezone(new \DateTimeZone("Europe/London"));
echo $date->getTimestamp() . "\n";  //1540690200

This is really bad, as changing the timezone should NEVER change the timestamp.
 
PHP Copyright © 2001-2020 The PHP Group
All rights reserved.
Last updated: Thu Nov 26 03:01:23 2020 UTC