PHP的DateTime :: Diff搞错了?

Mar*_*son 11 php diff datetime 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);
Run Code Online (Sandbox Code Playgroud)

打印'2'!请记住前一天的UTC时间= 1h - 2h = 23:05:00.

echo $d2->getOffset() / (60 * 60);
Run Code Online (Sandbox Code Playgroud)

打印'1'.DST发生了.UTC时间= 3h - 1h = 02:05:00

$di = $d1->diff($d2);
echo "Hours of DateInterval: " . $di->h;
Run Code Online (Sandbox Code Playgroud)

打印'2'!错误?

$hoursofdiff = ($d2->getTimeStamp() - $d1->getTimeStamp()) / 60 / 60;
echo "Calculated difference in hours: $hoursofdiff";
Run Code Online (Sandbox Code Playgroud)

打印'3'!正确?

当时钟在给定日期时间03:00:00时,所有瑞典人将他们的时钟倒退一小时至02:00:00.这意味着在01:05到03:05之间传递的总量是三个小时,非常类似于使用UNIX TimeStamp时的手动计算回显.就像我们用手指计算我们是否使用模拟时钟一样.当我们使用PHP自己的偏移逻辑(!)计算两个UTC时间戳之间的差异时更是如此.

它是PHP还是我的大脑停止正常工作?来自你们任何人的谴责所有存在于这个网站上的众神会让我如此开心!

我在Apache服务器上使用PHP 5.4(VC9).不幸的是我使用Windows 7 x64作为操作系统.我已经针对PHP日期/时间类中的所有错误声明测试了我的设置(有一些与Windows相关),并且可以确认我的系统没有.除了上述代码,我没有发现任何其他错误.我几乎验证了所有代码并输出了"PHP Architect的日期和时间编程指南"这本书.因此,我必须得出结论,它必须是我的大脑女巫违约,但我想我先在这里拍摄.

jml*_*nik 9

你是对的,PHP目前不处理DST转换......

错误报告#51051(仍然打开)和#55253(在PHP 5.3.9中修复)描述了您遇到的问题.

Daniel Convissor写了一篇RFC试图解决这个问题,但改变日志并没有暗示这已经解决了.我希望这可以在5.4中修复,但我没有看到任何证据.

当/如果它被实现,看起来你必须在时间字符串中附加"DST"或"ST".

最佳做法是以UTC格式进行所有日期计算,从而避免此问题.

这个DST最佳实践帖子也非常有用.