【发布时间】:2020-09-12 09:41:59
【问题描述】:
我在 PHP 中遇到了一件奇怪的事情。在Europe/Oslo 时区中,我从时间戳2020-03-29 03:00:00 中减去一小时(这正是Dailight Savings Time shift 发生的时间),结果是完全相同的时间戳2020-03-29 03:00:00!它应该导致2020-03-29 01:00:00。怎么没有?
一直到2020-03-29 03:59:59,它在减去一小时时返回完全相同的时间戳(尝试了sub() 和modify())。之后的下一秒,它会正确生成2020-03-29 03:00:00。
你可以像这样复制它:
date_default_timezone_set('Europe/Oslo');
echo (new \DateTime('2020-03-29 03:00:00'))->sub(new \DateInterval('PT1H'))->format('Y-m-d H:i:s');
我在 PHP 7.1.33、7.3.10 和 7.3.18 中都对此进行了测试。
附言。不过,在2020-03-29 01:00:00 上加 1 小时确实正确地给出了2020-03-29 03:00:00。
【问题讨论】:
-
This info 似乎与您的描述有关。
-
问题是,Datetime 对象带有时区。 DST 当天凌晨 2 点,时钟立即切换到 3 点。通过从凌晨 3 点减去 1 小时,您将在凌晨 2 点出来 - 如果您随后在奥斯陆时区格式化此日期时间,它会神奇地再次移动到凌晨 3 点......欢迎来到暮光区!