PHP时间()和DST问题结束 - 夏令时结束后1小时

时间:2013-09-24 00:17:06

标签: php time dst

我已经定义了这样的代码(为了清晰起见,简化版本):

$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月11日凌晨2:00 DST结束于America / New_York,时钟返回1小时至凌晨1:00。

当我在2013年3月11日DST结束(即凌晨2点到凌晨1点)以及凌晨1点到凌晨2点之间运行以上代码时,该行:

This should NEVER happen

已打印。但是,在DST转换之前或新的2:00 AM之后的任何时间都可以。

这导致了一个主要错误,导致用户尝试访问使用上述代码的函数,在DST转换后的一小时内失败。

PHP 5.2.11。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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");
}