PHP time() 和 DST 问题结束 - DST 结束后 1 小时



>我这样定义了这段代码(为清楚起见,简化版本):

$fifteenMinsLater = strtotime('+900 second', time());
$now = time();
 if ( $now > $fifteenMinsLater )   {  
    mtrace("This should NEVER happen"); 
 }
 else {
    mtrace("This should always be the case");
 }

2013 年 11 月 3 日凌晨 2:00,美国/New_York的 DST 结束,时钟倒退一小时至凌晨 1:00。

当我在 11 年 03 月 2013 日运行上述代码 DST 结束后(即在 2:00 AM 之后变为 1:00 AM)以及凌晨 1:00 和凌晨 2:00 之间的时间之间,该行:

This should NEVER happen

被打印出来。但是,在 DST 转换之前或新的 2:00 AM 之后的任何时候,一切都很好。

这导致了一个重大错误,导致用户尝试访问使用上述代码的功能在 DST 转换后的一小时内惨遭失败。

PHP 5.2.11.

有什么想法吗?

PHP

中的strtotime()和其他日期函数不考虑时区。 DateTime()确实:

$fifteenMinsLater = new DateTime();
$fifteenMinsLater->modify('+15 minutes');
$now = new DateTime();
if ( $now > $fifteenMinsLater )   {  
   mtrace("This should NEVER happen"); 
}
else {
   mtrace("This should always be the case");
}

以下是在 PHP 5.5 中执行此操作的方法:

$now = new DateTimeImmutable();
$fifteenMinsLater = $now->modify('+15 minutes');
if ( $now > $fifteenMinsLater )   {  
   mtrace("This should NEVER happen"); 
}
else {
   mtrace("This should always be the case");
}

最新更新