最近我创建了一个错误,我写了$object->expiry = strtotime('-1')
导致对象从现在起1小时后过期而不是永不过期。我应该做的是设置没有strtotime
的到期时间$object->expiry = -1
。
这个错误让我思考,为什么strtotime('-1')
会返回一个小时的时间戳?
同样,为什么strtotime('+1')
会在一小时后返回时间戳?
如果相反的情况发生,那对我来说是否有意义,为什么strtotime()
会以这种方式运作?
答案 0 :(得分:1)
strtotime()
使用"Supported Date and Time Formats"文档页面中描述的规则来解析输入字符串。
使用当前时间初始化输入字符串中不存在的日期和时间组件。
输入字符串'-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
加上两小时后的一小时。
如果您使用亚洲时区(更大的正偏移),差异会更大。如果您使用负偏移(美洲),它会在过去生成日期。