DateTime 时区格式
DateTime timezone when format
这是我在时区和 DateTime 方面遇到的一个奇怪问题,我会尽量简短:
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));
我得到:
string(24) "2016-03-28T19:00:00+0200" <-- Noticed that it has a different timezone
string(24) "2016-03-13T19:00:00+0100"
我讨厌 DateTime
P.S:当我创建第二个 DateTime 对象时,我克隆第一个对象并添加一个 DateInterval:
$someTime = clone $obj->getTime1();
$someTime ->sub(new \DateInterval('P'.$days.'D'));
$event->setTime2($someTime);
你得到额外一小时的原因是因为在 3 月的最后一个(完整)周末,我们 'change' 时区,并跳过一个小时。
今年,这发生在 3 月 27 日,这意味着我们实际上进入了另一个时区。 DateTime 对象会自动为您执行此操作,这就是您拥有 2 个不同时区的原因。
将在 10 月的最后一个(完整)周末,即 10 月 30 日反转。
自 1999 年以来,欧盟有 established 以下切换 from/to 夏令时的规则:
- 开始:三月的最后一个星期日
- 结束时间:10 月的最后一个星期日
这意味着国家之间不需要续签或事先达成协议。
你的例子恰好跨越了第一个边界。在法国,这意味着从 CET (+0100) to CEST (+0200) 切换。 PHP 考虑到了这一点。
这是我在时区和 DateTime 方面遇到的一个奇怪问题,我会尽量简短:
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));
我得到:
string(24) "2016-03-28T19:00:00+0200" <-- Noticed that it has a different timezone
string(24) "2016-03-13T19:00:00+0100"
我讨厌 DateTime
P.S:当我创建第二个 DateTime 对象时,我克隆第一个对象并添加一个 DateInterval:
$someTime = clone $obj->getTime1();
$someTime ->sub(new \DateInterval('P'.$days.'D'));
$event->setTime2($someTime);
你得到额外一小时的原因是因为在 3 月的最后一个(完整)周末,我们 'change' 时区,并跳过一个小时。
今年,这发生在 3 月 27 日,这意味着我们实际上进入了另一个时区。 DateTime 对象会自动为您执行此操作,这就是您拥有 2 个不同时区的原因。
将在 10 月的最后一个(完整)周末,即 10 月 30 日反转。
自 1999 年以来,欧盟有 established 以下切换 from/to 夏令时的规则:
- 开始:三月的最后一个星期日
- 结束时间:10 月的最后一个星期日
这意味着国家之间不需要续签或事先达成协议。
你的例子恰好跨越了第一个边界。在法国,这意味着从 CET (+0100) to CEST (+0200) 切换。 PHP 考虑到了这一点。