我想知道这是一个错误,还是我错过了什么。
创建一种方法来隔离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结束时似乎只会失败。
另外,我在几个不同的时区测试了几年,但我不知道这个潜在错误的深度。需要进行更多测试。
任何人都知道这是什么?
答案 0 :(得分:1)
创建一种方法来隔离DST从开启到关闭时的时间戳,反之亦然...
该方法已作为DateTimeZone::GetTransitions
存在。 Documentation here.
您可能还对确定某个特定日期/时间是否在过渡期内的相关问题感兴趣,该问题的描述为in this answer。