格式时的DateTime时区

时间:2016-03-25 10:52:57

标签: php datetime datetime-format

这是我遇到的一个奇怪的问题,我遇到过timezone和DateTime,我会保持简短:

SignInMessage

给我以下(好的,时区好等等):

var_dump($obj->getTime1());
var_dump($obj->getTime2());

但是当我想(在完全相同的行上)格式化为字符串时:

object(DateTime)#379 (3) {
  ["date"]=>
  string(19) "2016-03-28 19:00:00"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Europe/Paris"
}
object(DateTime)#378 (3) {
  ["date"]=>
  string(19) "2016-03-13 19:00:00"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(12) "Europe/Paris"
}

我明白了:

var_dump($obj->getTime1()->format(DateTime::ISO8601));
var_dump($obj->getTime2()->format(DateTime::ISO8601));

我讨厌DateTime

P.S:当我创建第二个DateTime对象时,我克隆第一个并添加一个DateInterval:

string(24) "2016-03-28T19:00:00+0200"  <-- Noticed that it has a different timezone
string(24) "2016-03-13T19:00:00+0100"

2 个答案:

答案 0 :(得分:4)

你获得额外一小时的原因是因为在3月的最后一个(完整)周末,我们“改变”时区,并且跳过一个小时。

今年,这发生在3月27日,这意味着我们实际上是在另一个时区设置的。 DateTime对象会自动为您执行此操作,这就是您有两个不同时区的原因。

将在10月30日的最后一个(完整)周末逆转。

答案 1 :(得分:1)

自1999年以来,欧盟有established以下关于从/到夏令时转换的规则:

  • 开始:三月的最后一个星期天
  • 结束:十月的最后一个星期天

这意味着不需要在国家之间续签或事先达成协议。

您的示例恰好跨越第一个边界。在法国,这意味着从CET(+0100)切换到CEST(+0200)。 PHP将此考虑在内。