>我这样定义了这段代码(为清楚起见,简化版本):
$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.
有什么想法吗?
中的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");
}