>最近我创建了一个错误,我写了$object->expiry = strtotime('-1')
导致对象从现在起 1 小时后过期,而不是从不过期。我应该做的是设置到期时间,没有像这样$object->expiry = -1
strtotime
.
这个错误让我想到,为什么strtotime('-1')
返回一个时间向前一小时的时间戳?
同样,为什么strtotime('+1')
返回一小时后的时间戳?
如果发生相反的情况,对我来说是有道理的,那么strtotime()
为什么要以这种方式工作呢?
strtotime()
使用"支持的日期和时间格式"文档页面中描述的规则来分析输入字符串。
输入字符串中不存在的日期和时间组件使用当前时间进行初始化。
输入字符串'-1'
和'+1'
不包含任何日期或时间。解析器将它们解释为时区更正。
您得到的是当前本地时间,时区更改为UTC-1
或UTC+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
.
如果使用亚洲时区(较大的正偏移量),则差异更大。如果使用负偏移量(美洲),它将生成过去的日期。