簡體   English   中英

gmdate在服務器上不一致嗎?

[英]gmdate not constant across servers?

我一直在研究一個需要隨着時間進行大量計算的應用程序。

為了保證一切正常,我開始:

$dateToday = strtotime(gmdate("m/d/y"));

據我所知,這應該是返回GMT日期。 那么服務器所處的時區,我應該得到相同的時間?

所以,正如我在localhost上開發的一切順利,但當我轉移到不同時區的服務器時,我開始遇到問題。

在localhost上回顯“$ dateToday”給了我“1501192800”,而在服務器上做同樣的事情我得到“1501214400”。 這與本地計算機和服務器之間的6h時差相同。

那我在這里錯過了什么?

謝謝

 $dateToday = strtotime(gmdate("m/d/y")); 

據我所知,這應該是返回GMT日期。

一點也不。

gmdate()使用GMT時區格式化日期。 由於您只使用一個參數調用它,因此通過調用time()來獲取格式化日期。

time()返回當前時間戳,即自Jan 1, 1970, 0:00:00 UTCJan 1, 1970, 0:00:00 UTC以來經過的秒數。

然后, gmdate()使用您在其第一個參數中提供的格式來生成其第二個參數的文本表示(我們看到的當前時間戳)。 gmdate("m/d/Y")返回的值gmdate("m/d/Y")07/28/2017

然后, 07/28/2017傳遞給strtotime() ,它嘗試將其解釋為日期並從中計算時間戳。 因為它不包含任何時間組件, strtotime()假定時間是0:00:00

趕緊來了。 因為作為strtotime()參數提供的字符串也不包含任何時區信息,所以PHP使用其配置來假定時區。 正如您已經發現的,由於配置不同,在兩台服務器上運行代碼會產生不同的結果。

對我來說, strtotime(gmdate('m/d/Y'))返回1501200000 ,這是今天( July 18, 2017 )在UTC時區開始的時間戳(時刻)(因為用於測試的PHP)使用“UTC”作為其默認時區 )。 您在不同服務器上獲得的值是今天在各自時區開始的時刻。

如果我使用為我的時區( Europe/Bucharest )正確配置的PHP運行相同的代碼,我得到1501189200 它與我使用UTC的值之前的10800秒,因為Europe/Bucharest目前是UTC+3 (東歐標准時間的常規+2加上1小時,因為夏令時。

PHP目前提供了一組處理日期和時間的類: DateTime名稱以Date開頭的其他 (在文檔中找到它們)。 它們比舊的日期和時間功能更容易使用,他們也知道如何處理時區(舊功能不知道)。

創建以UTC時區存儲今天開始的DateTime對象非常簡單:

$dateToday = new DateTime("today 0:00:00", new DateTimeZone("UTC"));

您也可以為“now”創建一個DateTime對象(在所需的時區中),然后將其時間設置為0:00:00

$dateToday = new DateTime("now", new DateTimeZone("UTC"));
$dateToday->setTime(0, 0, 0);

對於未在代碼中修改的DateTime對象(僅讀取它們),您最好創建DateTimeImmutable對象。 此類可防止意外更改其存儲的值。

暫無
暫無

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

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