TimeZoneInfo.GetSystemTimeZones()返回不同计算机上的不一致信息

时间:2012-02-01 11:14:39

标签: c# timezone

如果我使用

foreach (TimeZoneInfo info in TimeZoneInfo.GetSystemTimeZones())
{
    if (info.ToString()...

获取时区字符串列表,然后在某些系统上返回前缀为(GMT)的字符串,并返回其他系统上的字符串(UTC)。不是100%肯定这一点,但似乎Vista列表(GMT)值,Windows 7列表(UTC)值和Windows服务器列表(GMT)

发生了什么,我可以让Windows 7列出Vista GMT值吗?我想要一个适用于所有Windows机器的一致列表。

fyi在同一系统中,我还使用以下行填充MVC下拉列表:

<%: Html.DropDownListFor(model => model.Timezone,new SelectList(TimeZoneInfo.GetSystemTimeZones())) %>

由于

2 个答案:

答案 0 :(得分:4)

您正在使用TimeZoneInfo.ToString(),它使用TimeZoneInfo.DisplayName。只需 依赖于系统 - 如果您通过时钟编辑系统时区,则显示相同的列表(据我所知)。 (我刚看过Vista和Windows 7的机器,看到了你刚刚描述过的相同的名字。)

如果您要查找一致的名称,请改用Id属性。如果您想要从ID到一些已知显示名称的一致映射,您需要自己设置(例如,通过您所有系统与之通信的单个数据库)。您不应向用户显示Id属性本身,因为它非常令人困惑 - 它几乎总是标准时间 ID,这会让人们感到困惑在白天节省时间。

如果您想将船推出,Unicode CLDR有关于如何向用户显示时区的信息(请参阅core/common/bcp47/timezone.xml)但是使用了zoneinfo ID,那么您需要将这些映射回Windows系统ID(这是可行的;该信息也在CLDR中,在core/common/supplemental/windowsZones.xml中)。

答案 1 :(得分:0)

RE:“不是100%肯定这一点,但似乎Vista列表(GMT)值,Windows 7列表(UTC)值和Windows服务器列表(GMT)”

Windows Server 2008 R2返回UTC。 Server 2003返回GMT。