【发布时间】:2014-10-17 02:40:16
【问题描述】:
我想知道这是否是一个错误,或者我错过了什么。
在创建一种方法以在 DST 从打开到关闭时隔离时间戳,反之亦然,我注意到 DateTime::format('I') 的潜在错误。当 DST 结束并且时间向后切换一小时时,DateTime::format('I') 报告切换太迟了一小时。
在“美国/蒙特利尔”时区,我们可以查看 DST 结束时的这些时间戳:
1414904400,2014 年 11 月 2 日星期日 01:00:00 -0400(夏令时开启)
1414908000,星期日,2014 年 11 月 2 日 01:00:00 -0500(夏令时关闭)
1414911600,星期日,2014 年 11 月 2 日 02:00:00 -0500(夏令时关闭)
请注意,当 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('I') 我们会得到正确的答案。
date_default_timezone_set('America/Montreal');
echo date('I', 1414904400);
echo date('I', 1414908000);
echo date('I', 1414911600);
返回 100(如预期)
当 DST 开始时 DateTime::format('I') 工作正常,它似乎只在 DST 结束时失败。
另外,我已经在几个不同的时区测试了几年,但我不知道这个潜在错误的深度。需要进行更多测试。
有人知道这是什么吗?
【问题讨论】:
-
如果你真的认为这是 PHP 的 DateTime 实现中的一个错误,那么为什么不在bugs.php.net 上将它作为一个错误提出来 - 看起来它可能已经提出了 - bugs.php.net/bug.php?id=65811
-
好点,我会的。我在网上搜索并找不到任何东西,但后来我想这个错误一定太常见了,以至于被遗漏了。我想我是在怀疑自己。
-
#65811 肯定与您描述的问题相同,似乎还没有人解决它....如果您的 C 语言不错,请尝试查看源代码
-
看起来修改
DateTime上的时间戳并设置时区出错了。即使在设置后立即调用$dt->getTimestamp()也会返回错误的值。解决方法(直到修复错误)是$dt = new DateTime('@1414908000'); $dt->setTimezone($tz); echo $dt->format('Y-m-d H:i:s O (I) U'); -
请注意,
O格式代码也会返回不正确的结果,例如I