我想知道在Windows和OSx之间协调时区最简单的方法是什么?我已经尝试列出了Windows可以支持的所有时区,并尝试交叉引用OSx可以支持的列表。我将给出时区的缩写(3个字母),我需要相应地设置时区。有一个简单的方法吗?
答案 0 :(得分:2)
忘记使用3个字母的缩写 - 它们并不是唯一的。例如,简陋的“CST”可以是以下任何一种:
UTC-06:00
中央标准时间(北美)UTC-05:00
古巴标准时间UTC+08:00
中国标准时间UTC+09:30
中央标准时间(澳大利亚)UTC+10:30
中部夏令时(澳大利亚)相反,请使用标准IANA time zone identifiers,例如America/Los_Angeles
或Europe/London
。
在Windows上,您需要将这些映射到适当的Microsoft时区ID。例如,America/Los_Angeles
== "Pacific Standard Time"
。不要让名字欺骗你。尽管标识符中有“标准”一词,但它涵盖了整个太平洋时区,包括PST和PDT。
通常,您不能相信Microsoft标识符特别指代任何内容。例如,您应该使用“阿拉伯标准时间”,“阿拉伯标准时间”或“阿拉伯标准时间”吗?这是三个不同的区域,具有不同的含义和相似的名称。还有很多其他的例子。
而不是猜测,在Microsoft和IANA区域之间进行翻译的权威参考是the Unicode CLDR。它包含(除其他外),经过深入研究的translation matrix between the different time zones types。
请注意,IANA时区比Microsoft时区多得多。还有一些IANA区域没有Microsoft等效项。从IANA转换到Microsoft,(通常)有一个标识符选择。但是,从另一个方向转换,从Microsoft到IANA,您可能有多种可能性。您可能需要使用其他信息(例如国家/地区代码)来确定适当的映射。
如果您在.Net中执行此操作,则可以使用Noda Time和代码in this answer来执行翻译。 CLDR转换表包含在Noda Time中。
如果您在Java中执行此操作,则只需使用IANA标识符,因为JRE还包括CLDR转换表,并将本地Windows时区映射到相应的IANA时区。
您还可以在其他项目中找到CLDR,例如ICU4C and ICU4J。
此外,在评论中,您写道:
我需要实际设置操作系统的时区
你无法从Java轻松地做到这一点。在Windows中,需要调用多个Win32 native functions,并且您需要适当的权限。在其他操作系统中,我确信这些调用完全不同,但仍会存在权限问题。
通常,允许任何单个应用程序更改操作系统的时区是一个危险的想法。想象一下,如果多个应用程序开始争夺对时区的控制权。时区会影响系统上的所有内容。这将是非常糟糕的。