为什么 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-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
.
如果您使用亚洲时区(更大的正偏移),差异会更大。如果您使用负偏移量(美洲),它会产生过去的日期。
最近我创建了一个错误,其中我写了 $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-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
.
如果您使用亚洲时区(更大的正偏移),差异会更大。如果您使用负偏移量(美洲),它会产生过去的日期。