Edit report at https://bugs.php.net/bug.php?id=68549&edit=1
ID: 68549
Updated by: heiglandreas@php.net
Reported by: mfaust at usinternet dot com
Summary: Timezones and offsets are not properly used when
working with dates
Status: Open
Type: Bug
Package: Date/time related
Operating System: Linux
PHP Version: 5.6.3
Block user comment: N
Private report: N
New Comment:
@ roel dot harbers at on2it dot net
There is a response in sight, which is the - already in the initial bugreport mentionend - RFC
(https://wiki.php.net/rfc/datetime_and_daylight_saving_time)
The RFC has been accepted but so far not been implemented.
As PHP is an OpenSource Project: Feel free to create the appropriate PullRequest to fix this issue.
Previous Comments:
------------------------------------------------------------------------
[2021-11-08 11:04:03] roel dot harbers at on2it dot net
Still going wrong in php 7.4.3:
<?php
// $originalTimestamp = 1636275599; // ok
$originalTimestamp = 1636275600; // wrong (- 3600 sec)
// $originalTimestamp = 1636279199; // wrong (- 3600 sec)
// $originalTimestamp = 1636279200; // ok
$tz = new DateTimeZone('America/Los_Angeles');
// this fails in the opposite way:
// $originalTimestamp = 1635638399; // ok
// $originalTimestamp = 1635638400; // wrong (+ 3600 sec)
// $originalTimestamp = 1635641999; // wrong (+ 3600 sec)
// $originalTimestamp = 1635642000; // ok
// $tz = new DateTimeZone('Europe/Amsterdam');
$dt = new DateTime('now', $tz);
print_r($dt);
printf("now ISO8601 format: %s\n", $dt->format(DateTimeInterface::ISO8601));
printf("now timestamp: %d\n", $dt->getTimestamp());
printf("\nsetting timestamp to %d:\n\n", $originalTimestamp);
$dt->setTimestamp($originalTimestamp);
$actualTimestamp = $dt->getTimestamp();
print_r($dt);
printf("DateTime object's ISO8601 format: %s\n",
$dt->format(DateTimeInterface::ISO8601));
printf("DateTime object's UNIX timestamp: %d\n", $actualTimestamp);
printf("difference (should be 0): %d\n", $actualTimestamp - $originalTimestamp);
?>
How is this bug seven years old with not even a response in sight...
------------------------------------------------------------------------
[2021-10-01 16:09:59] cmb@php.net
Related To: Bug #73138
------------------------------------------------------------------------
[2015-12-30 22:07:41] 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.
------------------------------------------------------------------------
[2015-03-06 16:06:30] 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.
------------------------------------------------------------------------
[2014-12-05 05:33:55] yohgaki@php.net
http://3v4l.org/HGGjd
HHVM seems working correctly.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=68549
--
Edit this bug report at https://bugs.php.net/bug.php?id=68549&edit=1