【发布时间】:2013-09-29 00:59:05
【问题描述】:
我已经这样定义了这段代码(为了清楚起见,简化版):
$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 年 3 月 11 日和凌晨 1:00 到凌晨 2:00 之间的 DST 结束后(即凌晨 2:00 变为凌晨 1:00)运行上述代码时:
This should NEVER happen
被打印出来。但是,在 DST 转换之前或新的凌晨 2:00 之后的任何时间都可以。
这导致了一个重大错误,导致用户尝试访问使用上述代码的函数在 DST 转换后的一小时内惨遭失败。
PHP 5.2.11。
有什么想法吗?
【问题讨论】:
-
你确定你没有过分简单化吗?
strtotime&time返回 unix 时间戳,据了解,它不知道 DST/不会意外倒计时 3600 秒。您是在比较这些时间戳的表示,而不是原始整数时间戳本身吗? AFAIK,只有闰秒会影响 unix 时间戳。 -
$now 和 $fifteenMinsLater 的回声将大大有助于解决这个问题。
-
Site 3v4l.org 非常适合测试不同的 PHP 版本。只有版本 5.0.0 to 5.0.2 返回无效比较。