簡體   English   中英

為什么strtotime('-1')返回時間提前一小時的時間戳?

[英]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-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

如果使用亞洲時區,則差異會更大(正偏移量更大)。 如果使用負偏移量(美國),它將生成過去的日期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM