Bug #68549 [Opn]: Timezones and offsets are not properly used when working with dates

From: Date: Mon, 08 Nov 2021 11:28:18 +0000
Subject: Bug #68549 [Opn]: Timezones and offsets are not properly used when working with dates
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-237602@lists.php.net to get a copy of this message
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


Thread (12 messages)

« previous php.bugs (#237602) next »