PHP DateTime :: format('I')不准确的bug?

时间:2014-08-23 09:47:02

标签: php timezone format dst

我想知道这是一个错误,还是我错过了什么。

创建一种方法来隔离DST从开启切换到关闭时的时间戳,反之亦然,我发现了DateTime :: format(' I')的潜在错误。当DST结束并且时间向后切换一小时时,DateTime :: format(' I')报告开关太晚一小时。

在' America / Montreal'时区,我们可以在DST结束时查看这些时间戳:

1414904400,Sun,02 Nov 2014 01:00:00 -0400(DST on)
1414908000,Sun,02 Nov 2014 01:00:00 -0500(DST off)
1414911600,Sun,02 Nov 2014 02:00:00 -0500(DST off)

请注意,当重复01:00:00时,DST会在第二个时间戳结束。

但是,使用DateTime :: format(' I')会在第三个时间戳上报告结尾。

$timezone = new DateTimezone('America/Montreal');
$datetime = new DateTime('now', $timezone);
$datetime->setTimestamp(1414904400);
echo $datetime->format('I');
$datetime->setTimestamp(1414908000);
echo $datetime->format('I');
$datetime->setTimestamp(1414911600);
echo $datetime->format('I');

返回110(应为100)

如果我们使用日期('我'),我们会得到正确答案。

date_default_timezone_set('America/Montreal');
echo date('I', 1414904400);
echo date('I', 1414908000);
echo date('I', 1414911600);

返回100(如预期的那样)


当DST开始时DateTime :: format(' I')工作正常,DST结束时似乎只会失败。

另外,我在几个不同的时区测试了几年,但我不知道这个潜在错误的深度。需要进行更多测试。

任何人都知道这是什么?

1 个答案:

答案 0 :(得分:1)

  

创建一种方法来隔离DST从开启到关闭时的时间戳,反之亦然...

该方法已作为DateTimeZone::GetTransitions存在。 Documentation here.

您可能还对确定某个特定日期/时间是否在过渡期内的相关问题感兴趣,该问题的描述为in this answer