[英]why does strtotime('-1') return a timestamp one hour forward in time?
最近,我創建了一個錯誤,其中我寫了$object->expiry = strtotime('-1')
導致該對象從現在開始1小時過期,而不是從不過期。 我應該做的是在沒有strtotime
的情況下設置到期時間,例如$object->expiry = -1
。
這個錯誤讓我開始思考, 為什么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
。
如果使用亞洲時區,則差異會更大(正偏移量更大)。 如果使用負偏移量(美國),它將生成過去的日期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.