【问题标题】:Php DateTime manually select timezone's daylight saving time (DST)Php DateTime 手动选择时区的夏令时(DST)
【发布时间】:2018-03-14 13:19:20
【问题描述】:

是否可以在 Php 中设置 DateTime 对象的夏令时?

我在 DST 更改的确切时刻遇到了日期时间问题。 在欧洲/巴黎时区,日期2016-10-30 02:00:00 存在两次(因为这是 DST 更改的确切时刻(凌晨 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);

谢谢!

【问题讨论】:

    标签: php datetime timezone


    【解决方案1】:

    我想你已经从你的研究中看到,时区处理是complicated matter,当你处理 DST 时更是如此。您的用例不是很清楚,但是您可以通过添加 1 小时间隔来实现您的要求(这很重要:不仅仅是一个 小时,而是一个 小时间隔 ) 到时间。然后,DateTime 实例将考虑 DST 并仍然为您提供正确的时间(即,不“跳过”它):

    <?php
    $dateString = '2016-10-30 01:30:00'; // start time
    $dateBefore = \DateTime::createFromFormat('Y-m-d H:i:s', $dateString, new DateTimeZone('Europe/Paris'));
    var_dump($dateBefore);
    $d = clone $dateBefore;
    $d->setTimeZone(new \DateTimeZone('UTC'));
    var_dump($d); // 23:30
    
    echo PHP_EOL."------".PHP_EOL;
    
    $dateBefore->add(new DateInterval('PT1H'))->format("Y-m-d H:i:s"); // add one hour without skipping
    var_dump($dateBefore);
    $d = clone $dateBefore;
    $d->setTimeZone(new \DateTimeZone('UTC'));
    var_dump($d); // 00:30
    
    echo PHP_EOL."------".PHP_EOL;
    
    $dateString = '2016-10-30 02:30:00';
    $dateBefore = \DateTime::createFromFormat('Y-m-d H:i:s', $dateString, new DateTimeZone('Europe/Paris'));
    var_dump($dateBefore);
    $dateBefore->setTimeZone(new \DateTimeZone('UTC'));
    var_dump($dateBefore); // 01:30, uses DST
    

    Demo

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      相关资源
      最近更新 更多