PHP DateTimeZone转换似乎不正确

时间:2015-09-07 02:47:27

标签: php datetime transitions dst

我目前正在使用PHP的DateTime,并注意到PHP的DateTimeZone对象中的转换时间似乎不正确。我只用“美国/哈瓦那”时区进行了测试,所以我不确定这是否是一个问题。

这方面的一个很好的例子就是:

var_dump((new DateTimeZone("America/Havana"))->getTransitions());

如果您“ctrl-f”并查找“2016-03-13”,您会注意到它表示转换发生在2016年3月13日UTC时间上午5:00,当时它实际上应该是7:00 2016年3月13日上午UTC。

我已经尝试通过安装一个外部TimeZone DB(具有pecl的timezonedb来确定)来修复此问题,但问题似乎仍然存在。我需要这个修复的原因是因为它似乎弄乱了我的DateTime对象并且它没有表现出它应该如何。例如,它似乎是添加随机小时如果试图构建此特定日期:

$̶t̶e̶s̶t̶ ̶=̶ ̶n̶e̶w̶ ̶D̶a̶t̶e̶T̶i̶m̶e̶(̶"̶2̶0̶1̶3̶-̶0̶3̶-̶1̶3̶ ̶0̶0̶:̶3̶0̶:̶0̶0̶"̶,̶ ̶n̶e̶w̶ ̶D̶a̶t̶e̶T̶i̶m̶e̶Z̶o̶n̶e̶(̶"̶A̶m̶e̶r̶i̶c̶a̶/̶H̶a̶v̶a̶n̶a̶"̶)̶)̶;̶ ̶ ̶

如果您的var_dump上述变量,它会增加了一小时,这使得没有任何意义,我̶o̶p̶i̶n̶i̶o̶n̶.̶不管怎么说,如果有人能够帮助这将是令人难以置信的。

更新

我还没有解决这个问题,但我似乎对上面的一个例子有所了解。现在的问题似乎是那个

$test = new DateTime("2013-03-13 00:30:00", new DateTimeZone("America/Havana"));
var_dump($test->getOffset());

似乎要返回-14400,因为它认为DST已经发生,实际上它应该返回-18000,因为DST还没有发生。

1 个答案:

答案 0 :(得分:0)

$test = new DateTime("2013-03-13 00:30:00", new DateTimeZone("America/Havana"));

<强>结果:

public 'date' => string '2013-03-13 00:30:00.000000' (length=26)
public 'timezone_type' => int 3
public 'timezone' => string 'America/Havana' (length=14)

它没有增加一个小时。

你想要达到什么目的?更多信息将有助于您更好地回答。

查看您的示例似乎是您尝试将日期时间转换为某个指定的时区。如果那是你的目标,我强烈建议Carbon