2017-02-17 41 views
0

社會我們使用時區,但由於某些原因,PHP使用一長串主要城市的時區設置。我經常在世界各地的網站上工作,並且很難確定哪個時區設置是正確的。如何可靠地確定正確的php date.timezone設置?

例如,您正在德國阿爾布斯塔特的一個網站上工作。你做谷歌搜索,發現Albstadt是GMT + 1。然後你到php的文檔頁面找到這個:http://php.net/manual/en/timezones.europe.php

好吧,這裏有一個歐洲主要城市的列表。不是很有幫助。即使該頁面的標題爲「支持的時區列表」,實際上它們是而不是「時區」。除非你碰巧知道哪些城市是GMT + 1,看起來你有點卡住試驗和錯誤,直到你受到打擊。似乎應該有一個像PHP設置:

date.timezone = 'GMT+1' 

但沒有。因此,我的問題:如何輕鬆確定給定地點的正確date.timezone設置?

(注意:我知道這個問答& A的:List of US Time Zones for PHP to use?,但我不是在尋找一個名單,我也不認爲「這裏是一個名單,我發現」一個可靠的方法來確定正確的設置)

+1

某人,某個地方,將不得不維持,因爲這個東西的更改列表。我不確定是否有比查詢某個列表或API更好的答案。 – NathanOliver

+5

特別是,它是IANA:http://www.iana.org/time-zones/repository/tz-link.html – Gordon

+2

按照您建議的方式執行此操作的一個問題是它不考慮DST。舉個例子,[America/Sao_Paulo](http://php.net/manual/en/timezones.america.php)和America/Bahia都是GMT -3,但是America/Sao_Paulo巴西夏令時,而「美國/巴伊亞」不。 – duplode

回答

3

如果你想知道一個國家的時區,你可以使用

print_r(
    DateTimezone::listIdentifiers(
     DateTimeZone::PER_COUNTRY, 
     'DE' 
    ) 
); 

這將給你喜歡的輸出:

Array 
(
    [0] => Europe/Berlin 
    [1] => Europe/Busingen 
) 

布辛根會更接近Albstadt,但這並不重要,因爲德國只有一個時區,即CET(夏季CEST),所以兩者都可以使用。但對於擁有多個時區的國家來說,這隻會讓你縮小範圍,而不是精確定位它。

You can also use GMT,儘管它不建議,因爲

警告:請不要使用任何這裏列出(除了UTC)的時區,他們只存在向後兼容的原因,有可能引致錯誤的行爲。

但是,它的工作:

date_default_timezone_set('Etc/GMT+10'); 
echo date(DATE_ATOM); // prints 2017-02-17T10:10:24-10:00 

併爲CET:

date_default_timezone_set('CET'); 
echo date(DATE_ATOM); // 2017-02-17T21:31:35+01:00 

確保通過http://www.iana.org/time-zones/repository/tz-link.html瞭解更多詳情閱讀。 IANA是PHP使用的時區數據庫的維護者。特別是,該位是很重要的:

數據庫中的每個位置表示保持本地時間所有的時鐘都同意從1970年開始位置是由大陸或海洋鑑定,然後通過位置的名稱,一個區域,該區域通常是該地區內最大的城市。例如,America/New_York代表美國東部大部分時區;美洲/菲尼克斯代表亞利桑那州的大部分地區,它使用沒有夏令時(DST)的山地時間;美國/底特律代表了密歇根州的大部分地區,它使用東部時間,但在1975年有不同的DST規則;其他條目代表較小的區域,例如印第安納州的Starke County,它在1991年從中央時間切換到東部時間,並在2006年切換。爲了在擴展的POSIX實施中使用數據庫,將TZ環境變量設置爲位置的全名,例如TZ = 「美國/紐約」。

還要注意大段標題爲時區邊界在同一頁上。

您可能也有興趣How to get a time zone from a location using latitude and longitude coordinates?

+0

這是非常棒的信息 - 尤其是最後一個環節。 PHP是否依賴IANA的數據庫在某處存檔或僅僅是假設? – billynoah

+1

@billynoah在http://php.net/manual/en/timezones.others.php提及。另外,http://php.net/manual/en/timezones.php表示最新版本的時區數據庫可以通過PECL的»timezonedb(https://pecl.php.net/package/timezonedb)進行安裝,此擴展使用的數據來自位於http://www.iana.org/time-zones的「Olson」數據庫,該數據庫爲 。 – Gordon