PHP DateTime::Diff 弄错了吗?

标签 php datetime diff dts

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/

相关文章:

ruby - ruby 1.9 上的砂砾警告

PHP PDO 在不同的函数中连接和关闭连接

php - 如何使用 php 将文件 move 到另一个文件夹?

刷新页面时php curl请求不关闭

perl - 在 perl 中,我如何从通过文本文件并在 dd-Month-YYYY(01-jan-1990) 中输出的日期中减去 10 天

html - diff 到 html (diff2html) 程序

comments - 如何区分两个文件,但忽略 Perl/C/C++ 注释中的差异?

php - Ticketmaster 风格的订票系统? PHP/MySQL

python - 将当前日期与 CSV 文件匹配并打印匹配项

r - 导入指定时区的日期时间,忽略夏令时