【发布时间】:2016-09-21 16:46:40
【问题描述】:
考虑这段代码,我们要在其中添加或减去一秒:
date_default_timezone_set("Europe/Amsterdam");
$time = 1477789199;
echo $time . ' - ' . date('r', $time) . "\n";
// 1477789199 - Sun, 30 Oct 2016 02:59:59 +0200
这是正确的,因为这个时间戳仍然在 DST(夏令时/夏令时)之内。
但是现在让我们在时间戳整数上加一秒,然后退出 DST:
$new = $time + 1;
echo $new . ' - ' . date('r', $new);
// 1477789200 - Sun, 30 Oct 2016 02:00:00 +0100
万岁! PHP 看到一秒钟后不再有 DST 并显示正确的时间字符串。
但是如果我们没有在时间戳整数上添加一秒,而是使用strtotime() 来添加一秒:
$new = strtotime('+1 second', $time);
echo $new . ' - ' . date('r', $new);
// 1477792800 - Sun, 30 Oct 2016 03:00:00 +0100
哎呀!我们只是提前了一个多小时而不是一秒钟。即使你增加一秒、一小时、一天或一年,你总是会得到额外的一小时。即使您添加多年,您也只会获得额外的一小时,这很奇怪,因为我们每年都会进入和退出夏令时,但无论您添加多少年,您都只会获得额外的一小时
但是一旦我们在 10 月份退出 DST 并减去一秒,一切都会正常...
但话又说回来了。如果我们在 3 月,刚刚进入 DST,我们减去一秒,我们反过来观察到完全相同。
等等,什么?!所以……?
echo strtotime('+ 1 second - 1 second', 1477789199); // echoes 1477792799
哇...
对我来说,这听起来像是一个错误。还是这是“设计使然”?有没有人知道这是否记录在某处,或者是否需要报告?
【问题讨论】:
-
糟糕。如果我在发布之前检查了 PHP 错误池,我会发现 2012 年报告了类似的问题,但没有跟进:bugs.php.net/bug.php?id=62185
-
来自doc:
Using this function for mathematical operations is not advisable. It is better to use DateTime::add() and DateTime::sub() in PHP 5.3 and later, or DateTime::modify() in PHP 5.2. -
错误报告考虑版本 5.6.26。你有其他版本吗?
-
@sємsєм 是的,5.3 也是,我现在什至读到有人在 php7 中也有它