为什么 strtotime('-1') 会返回时间向前一小时的时间戳?



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

这个错误让我想到,为什么strtotime('-1')返回一个时间向前一小时的时间戳?

同样,为什么strtotime('+1')返回一小时后的时间戳?

如果发生相反的情况,对我来说是有道理的,那么strtotime()为什么要以这种方式工作呢?

strtotime()使用"支持的日期和时间格式"文档页面中描述的规则来分析输入字符串。

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

输入字符串'-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.

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

最新更新