【问题标题】:PHP DateTime::format('I') inaccuracy bug?PHP DateTime::format('I') 不准确错误?
【发布时间】: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

标签: php timezone format dst


【解决方案1】:

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

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

您可能还对确定特定日期/时间是否在过渡期内的相关问题感兴趣,这在in this answer 中进行了描述。

【讨论】:

  • 谢谢。我测试了 GetTransitions 方法,它运行良好。你是对的,它解决了我的问题,所以我上面的代码现在无关紧要了。谢谢你的帮助。您并没有真正回答我的问题(关于错误),但您解决了我的整体问题,所以我想我会将您的答案标记为已接受。
  • Peter 在问题 cmets 中的回答解决了这个错误,我同意这些发现。很高兴这有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2017-10-04
  • 1970-01-01
  • 2011-02-10
相关资源
最近更新 更多