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

时间:2018-03-15 10:50:59

标签: php strtotime

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

这个错误让我思考,为什么strtotime('-1')会返回一个小时的时间戳?

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

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

1 个答案:

答案 0 :(得分:1)

strtotime()使用"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加上两小时后的一小时。

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