2011-02-11 83 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作为机器的内部时间,所以它需要可转换为本地时间的时区文件。

由于偏移的两台机器描述的时间免费,但方向相反,它按理说,时区文件是负相关的对方。换句话说,如果你从一个区域中选取一组区域文件,另一个区域文件将为负值。