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 年 3 月 11 日凌晨 2:00,美国/纽约的夏令时结束,时钟倒转一小时到凌晨 1:00。

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

This should NEVER happen

被打印。但是,在 DST 转换之前或新的凌晨 2:00 之后的任何时间都很好。

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

PHP 5.2.11。

有任何想法吗 ?

4

1 回答 1

0

strtotime()和 PHP 中的其他日期函数不考虑时区。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");
}
于 2013-09-24T00:23:25.290 回答