Php DateTime手动选择时区的夏令时(DST)

时间:2017-10-03 10:57:32

标签: php datetime timezone

是否可以在Php中设置DateTime对象的DST?

我在DST更改的确切时刻遇到日期问题。 在欧洲/巴黎时区,日期2016-10-30 02:00:00存在两次(因为这是夏令时的确切时刻(凌晨3点再次凌晨2点)

让我们考虑一下这段代码:

$dateString = '2016-10-30 01:30:00';
$dateBefore = \DateTime::createFromFormat('Y-m-d H:i:s', $dateString, new DateTime('Europe/Paris'));
$dateBefore->setTimeZone(new \DateTimeZone('UTC'));

$dateString = '2016-10-30 02:30:00';
$dateAfter = \DateTime::createFromFormat('Y-m-d H:i:s', $dateString, new DateTime('Europe/Paris'));
$dateAfter->setTimeZone(new \DateTimeZone('UTC'));

$dateBefore是' 2016-10-29 23:30:00' $dateAfter是' 2016-10-30 01:30:00'

那么如何生成日期' 2016-10-30 00:30:00'这里吗?

是否可以做这样的事情?

$winterTZ = new DateTime('Europe/Paris');
$winterTZ->setDST(false);
$winterDate = \DateTime::createFromFormat('Y-m-d H:i:s', $dateString, $winterTZ);

$summerTZ = new DateTime('Europe/Paris');
$summerTZ->setDST(true);
$winterDate = \DateTime::createFromFormat('Y-m-d H:i:s', $dateString, $summerTZ);

谢谢!

1 个答案:

答案 0 :(得分:0)

正如我想象你从研究中看到的那样,时区处理是complicated matter,当你处理DST时更是如此。您的用例不是那么清楚,但您可以通过添加1小时间隔来实现您的要求(这很重要:不仅仅是小时,而是小时间隔到了时间。然后,{{ ip_addresses|ipaddr('host') }} 实例将考虑DST并仍然给你正确的小时(即,不“跳过”它):

DateTime

Demo