DateTime::Diff 应计算适当的时间间隔并考虑夏令时 (DST) 和闰年。虽然显然不是这样。恐怖代码:
$d1 = new DateTime("2011-10-30 01:05:00", new DateTimeZone("Europe/Stockholm"));
$d2 = new DateTime("2011-10-30 03:05:00", new DateTimeZone("Europe/Stockholm"));
echo $d1->getOffset() / (60 * 60);
打印“2”!因此请记住,前一天的 UTC 时间 = 1h - 2h = 23:05:00。
echo $d2->getOffset() / (60 * 60);
打印“1”。夏令时发生了。 UTC 时间 = 3h - 1h = 02:05:00。
$di = $d1->diff($d2);
echo "Hours of DateInterval: " . $di->h;
打印“2”!错了吗?
$hoursofdiff = ($d2->getTimeStamp() - $d1->getTimeStamp()) / 60 / 60;
echo "Calculated difference in hours: $hoursofdiff";
打印“3”!正确吗?
当时钟在给定日期转到 03:00:00 时,所有瑞典人都将时钟拨回一小时至 02:00:00。这意味着在 01:05 到 03:05 之间传递的总量是三个小时,很像使用 UNIX 时间戳时回显的手动计算。如果我们使用模拟时钟,就像我们用手指计算一样。更重要的是,当我们计算两个 UTC 时间戳之间的差异时,我使用 PHP 自己的偏移量逻辑 (!)。
是 PHP 还是我的大脑停止正常工作?站上各位大神的斥责一下我就开心死了!
我在 Apache 服务器上使用 PHP 5.4 (VC9)。不幸的是我使用 Windows 7 x64 作为操作系统。我已经根据 PHP 的日期/时间类中的所有错误声明测试了我的设置(有几个与 Windows 相关)并且可以确认我的系统没有任何错误。除了上述代码外,我没有发现任何其他错误。我几乎验证了所有代码并输出了“PHP Architect's guide to date and time programming”这本书必须提供的。因此,我必须得出结论,这一定是我的大脑女巫违约了,但我想我会先在这里试一试。
最佳答案
你是对的,PHP 目前不处理 DST 转换...
错误报告 #51051 (仍然打开)和 #55253 (已在 PHP 5.3.9 中修复)描述您遇到的问题。
Daniel Convissor 写了 an RFC trying to address the issue一段时间前,但更改日志并未表明此问题已得到解决。我希望这会在 5.4 中修复,但我没有看到任何证据。
何时/如果它被实现,看起来您必须将“DST”或“ST”附加到时间字符串。
最佳做法是使用 UTC 进行所有日期计算,这样可以避免此问题。
This DST best practices post信息量也很大。
关于PHP DateTime::Diff 弄错了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9695870/