【问题标题】:PHP DateTimeZone Transitions seem to be incorrectPHP DateTimeZone 转换似乎不正确
【发布时间】:2015-12-02 12:32:50
【问题描述】:

我目前在 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̶.̶不管怎么说,如果有人能够帮助这将是令人难以置信的。 P>

更新

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

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

似乎返回 -14400,因为它认为 DST 已经发生,而实际上它应该返回 -18000,因为 DST 尚未发生。

【问题讨论】:

  • 你的问题是由夏令时引起的吗?
  • 问题是我的 PHP TimeZone DB 似乎不包含上述正确的转换日期。似乎要休息 2 个小时,这就是问题所在。

标签: php datetime transitions dst


【解决方案1】:
$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

【讨论】:

  • 你说得对,它似乎确实正确地创建了 DateTime 对象。上次测试时,我一定是做错了什么。现在要更新我的问题,我不得不说,如果您使用 $test->getOffset() 偏移量将不正确,我将其用于特定目的。在这种情况下,它应该返回 -18000,但它会返回 -14400。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2012-06-09
  • 2014-07-16
相关资源
最近更新 更多