2011-02-11 53 views
7

所有Windows中的時區顯示以這樣的方式像Linux- Windows時區映射?

(GMT+10:00) Canberra, Melbourne, Sydney

GMT和偏移和地點。反過來,Linux將每個時區作爲/ usr/share/zoneinfo/[Continent]/[Place]中的目錄映射。

我需要將每個Windows時區映射到我的應用程序的Linux時區。 像

(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi => Asia/Calcutta 

現在的問題表面爲International Date Line West它位於俄羅斯和美國之間。在Windows中,它的標記爲(GMT-12:00)的國際日期線West,以及各種來源,我在Linux中發現它的Etc/GMT + 12。

(GMT-12:00) International Date Line West => Etc/GMT+12 

(GMT+12:00) Coordinated Universal Time+12 => Etc/GMT-12 
(GMT-02:00) Coordinated Universal Time-02 => Etc/GMT+2 
(GMT-11:00) Coordinated Universal Time-11 => Etc/GMT+11 

這使我感到困惑和我的應用程序與時間戳w.r.t UTC和UTC偏移緊密合作。所以這個映射讓我和應用程序感到困惑。

任何人都可以解釋爲什麼在相同的地方爲什麼有-12和+12的偏移量相反的情況?

感謝提前:)

回答

20

Unicode.org承載映射作爲CLDR的一部分。 You can get to the latest version here。從該頁面鏈接的數據也有XML版本。

你可以找到如何從XML數據here映射示例代碼(在Python)。

強制性時區的咆哮:

注意,不管是誰在Windows中實現的時區支持是毒品。我不是在跟你開玩笑。看看時區名稱。爲什麼中歐時間被稱爲「浪漫標準時間」。浪漫?什麼,因爲它包括巴黎,或?羅馬標準時間可能有意義,它也包括羅馬,但浪漫!?

而且,在註冊表中的時區不其ID下舉辦的。不,他們瘋狂地按照他們的顯示名稱組織!由於這是本地化的,這意味着每個時區都將位於Windows的不同翻譯下的不同密鑰下!所以要找到合適的時區,你必須查看所有的時區,看看哪個區域有正確的ID。

我有太here示例代碼。請參閱get_win_timezone()函數。

我不知道是否設計這個決定POSIX應該扭轉時區的標誌的同一個人,所以-8小時意味着 8小時。無論如何,我確定他們一起抽菸是非法的。

+0

感謝Lennart和NullToken :) – 2011-12-28 07:11:23

2

Etc目錄的定義意味着是POSIX的風格,因此他們必須從你所期望的符號反轉。我不是POSIX的專家,但據我所知,最基本的想法是通過結合他們的本地名稱和GMT的偏移量來表達timzones。對於中歐的一個例子(歐洲中部時間/ CET):

Europe/Berlin (w/o daylight savings) equals GMT+01:00 equals CET-1 

中其實Etc目錄GMT-1描述了一個叫做「GMT」,這是未來(真正的)格林尼治標準時間的一小時(fictous)時區。

據我所知,這些文件僅用於允許您創建(符號)鏈接,因此如果您位於歐洲中部的某個地方,您可以創建一個指向GMT-1的鏈接並將其命名爲CET-1

我可以給你的最好的建議是完全忽略Etc目錄,並使用一些從Windows時區名稱到unix時區文件夾/文件的映射表。 Windows時區信息不僅提供GMT的偏移量,還知道夏令時(以及何時開始或結束)。時區數據庫中的文件夾/文件也是如此,但不適用於Etc目錄中的文件 - 它們給GMT提供了一個簡單的靜態偏移量。

可以找到tz數據庫中的時區列表in the wikipedia

+0

:)在你的建議,我找到了真正的原因,並得到了解決方案:)謝謝帕特里克:) – 2011-02-14 13:00:20

2

如果所有文件的符號都相反,那麼您正在查看的文件是正向映射偏移量,而您可能更熟悉的是反向映射偏移量。

Windows通常使用本地時區作爲機器的內部時間,因此它需要可以轉換回UTC的時區文件。 Linux通常使用UTC作爲機器的內部時間,所以它需要可轉換爲本地時間的時區文件。

由於偏移的兩臺機器描述的時間免費,但方向相反,它按理說,時區文件是負相關的對方。換句話說,如果你從一個區域中選取一組區域文件,另一個區域文件將爲負值。