通过date()进行的PHP DST检测已颠倒

时间:2018-10-01 07:21:54

标签: php amazon-web-services amazon-ec2 time dst

我们遇到了一个问题,该问题导致AWS EC2托管的系统出现严重故障。 我们使用date('I')(大写i)的PHP命令来检测夏令时是否有效。整个夏天它一直很开心地返回“ 1”。

在2018年9月29日上午7点左右,它开始返回“ 0”,表示更改为冬季时间。 这种变化几乎恰好发生在即将于10月29日发生更改的一个月前。

因此,我们现在的UTC时间减少了一个小时。 出于某种原因,PHP我们的EC2认为时间转换了一个月还为时过早。

Linux时区为:Europe / Dublin(IST,+0100) PHP时区通过date_default_timezone_set('Europe / Dublin');

date('I', strtotime('2018-09-29 02:00:00')) // returns "0" - which is wrong as DST is active now!

DST将于2018年10月29日在爱尔兰关闭

date('I', strtotime('2018-11-29 02:00:00')) // returns "1" - which is wrong as DST is Summer time!

编辑:在多个AWS EC2实例上确认相同问题。我将联系Amazon AWS支持并使用解决方案更新此线程。

2 个答案:

答案 0 :(得分:1)

我想分享我对现有产品进行DST修复的经验。

    $ssCurrentTimeZone    = date_default_timezone_get();
    $oDateTimeZone       = new DateTimeZone($ssCurrentTimeZone);
    $oDateTime           = new DateTime("now", $oDateTimeZone);

如上所述,php的示例正在我现有的产品上运行。 如果您使用new DateTime(),则不需要处理任何与DST相关的内容。

希望您可以使用此想法节省时间。

答案 1 :(得分:0)

问题已解决:https://bugs.php.net/bug.php?id=76983 显然,都柏林时区基于某些历史偏移量存在例外。 我尚未完全理解其背后的原因,但这从技术上解释了这个问题。