2015-09-07 119 views
0

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

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

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

如果“CTRL-F”并查找“2016年3月13日”你会发现,它说的转变发生在5: 00 AM在2016年3月13日,实际上它应该是在2016年3月13日上午7:00。

我已经尝试通过安装外部TimeZone数据库(timezonedb与pecl准确),但问题似乎仍然存在。我需要这个固定的原因是因为它似乎与我的日期时间对象搞乱,它不是它应该如何行事。例如,它似乎是添加随机小时,如果你试图建立这个日子:

$̶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̶.̶不管怎么说,如果任何人可以帮助这将是不可思议的。

UPDATE

我还没有解决这个问题,但是我似乎已经错了的上述例子中的一个。现在的问题似乎是,

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

好像是返回-14400,因为它认为,当实际上它应该返回-18000因为DST还不发生DST已经发生。

+0

你的问题是否可以由夏令时导致? – m69

+0

问题是我的PHP TimeZone DB似乎没有包含上面提到的正确的转换日期。这似乎是2个小时了,这就是问题所在。 – startingwars

回答

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

+0

你说得对,它似乎确实创建了DateTime对象。上次测试时,我一定做了不正确的事情。现在要更新我的问题,我不得不说,如果使用$ test-> getOffset(),偏移量将不正确,我将其用于特定目的。在这种情况下,它会返回-14400,当它应该仍然返回-18000。 – startingwars