为什么 strtotime('-1') return 时间戳提前一小时?

why does strtotime('-1') return a timestamp one hour forward in time?

最近我创建了一个错误,其中我写了 $object->expiry = strtotime('-1') 导致对象从现在起 1 小时后过期,而不是永远不会过期。我应该做的是像这样 $object->expiry = -1.

设置没有 strtotime 的到期时间

这个错误让我开始思考,为什么 strtotime('-1') return 时间戳提前一小时?

同样,为什么 strtotime('+1') return 时间戳会倒退一小时?

如果发生相反的情况对我来说很有意义那么为什么 strtotime() 以这种方式工作?

strtotime() uses the rules described in the "Supported Date and Time Formats" 解析输入字符串的文档页面。

输入字符串中不存在的日期和时间组件使用当前时间进行初始化。

输入字符串 '-1''+1' 不包含任何日期或时间。解析器将它们解释为时区更正。

您得到的是您当前的当地时间,时区更改为 UTC-1UTC+1。返回值取决于您服务器的时区。

仅当您的服务器时区设置为UTC时,它是未来一小时或过去一小时。否则,当您将值格式化为本地时间时,您获得的值包含应用两次的本地时区偏移量。

例如,我当地的时区是UTC+2,我现在的当地时间是2018-03-15 13:24:20 +0200

供参考,当前UTC时间和当地时间:

$ php -r 'echo(gmdate("r"));'
# Thu, 15 Mar 2018 11:24:20 +0000
$ php -r 'echo(date("r"));'
# Thu, 15 Mar 2018 13:24:20 +0200

这是 strtotime('-1'); 产生的结果:

$ php -r 'echo(date("r", strtotime("-1")));'
# Thu, 15 Mar 2018 16:24:21 +0200
$ php -r 'echo(date("r", strtotime("+1")));'
# Thu, 15 Mar 2018 14:24:27 +0200

strtotime("-1") 不是未来 1 小时而是 3 小时。一小时因为 '-1' 加上两小时因为 UTC+2.

如果您使用亚洲时区(更大的正偏移),差异会更大。如果您使用负偏移量(美洲),它会产生过去的日期。