2016-03-18 103 views
2

我正在處理一些時間相關的功能,我選擇始終使用UTC時間並將時間戳存儲爲整數以保持一致性。PHP mktime和時區

但是,我注意到,當我使用mktime時,似乎當前設置的時區具有返回值mktime的影響。從文檔中我知道mktime應該返回自發生以來的秒數:

返回與給定參數對應的Unix時間戳。這個 timestamp是一個長整數,包含Unix Epoch(1970年1月1日00:00:00 GMT)與指定的時間之間的 之間的秒數。

http://php.net/manual/en/function.mktime.php

然而,似乎是mktime包括當前設置時區。如果使用下面的代碼:

date_default_timezone_set('UTC'); 
$time = mktime(0, 0, 0, 1, 1, 2016); 
echo "{$time}\n"; 

date_default_timezone_set('Australia/Sydney'); 
$time = mktime(0, 0, 0, 1, 1, 2016); 
echo "{$time}\n"; 

我希望這兩個時間瓦萊斯是相同的,但顯然他們都沒有:

1451606400 
1451566800 

這似乎是exacly 11小時的時差:

1451606400 - 1451566800 = 39600/(60*60) = 11 

對於mktime和/或爲什麼在使用mktime時考慮的時區有什麼不正確理解?

回答

5

我不能告訴你爲什麼是它(PHP從來沒有對我有意義,當涉及到日期和時間)的方式,但有另一種功能gmmktime()這是

等同於mktime()除了傳遞的參數代表GMT日期。 gmmktime()在內部使用mktime(),因此只能使用派生本地時間內有效的時間。

還有一個comment on the PHP documentation for this function它解釋瞭如何mktime()gmmktime()time()工作。從本質上講,他們假定即使UNIX時間戳本身不帶時區,也總是在時區中思考。

+1

Ouch。這很糟糕。他們所要做的就是在所有時間功能上始終使用UTC,並且只在「顯示」時間時才合併時區。我猜這是因爲PHP的「歷史」......感謝您的回答! – Luke