【问题标题】:TimeZoneInfo.GetSystemTimeZones() returns inconsistent information on different computersTimeZoneInfo.GetSystemTimeZones() 在不同的计算机上返回不一致的信息
【发布时间】:2012-02-24 01:48:32
【问题描述】:

如果我使用

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

获取时区字符串列表,然后在某些系统上返回以 (GMT) 为前缀的字符串,在其他系统上以 (UTC) 为前缀。对此不是 100% 确定,但似乎 Vista 列出 (GMT) 值、Windows 7 列出 (UTC) 值和 Windows Server 列表 (GMT)

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

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

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

谢谢

【问题讨论】:

  • 为什么要一个常量列表?这听起来像是向用户显示的数据,因此很可能是本地化的。我确信有一些属性可以为您提供一个独特、稳定的 ID。但该 id 很可能只为计算机设计。

标签: c# timezone


【解决方案1】:

您正在使用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 中)。

【讨论】:

  • 感谢您的信息。我会听从你的建议,自己设置一个自定义列表。
【解决方案2】:

RE:“不是 100% 确定这一点,但似乎 Vista 列出 (GMT) 值、Windows 7 列出 (UTC) 值和 Windows Server 列表 (GMT)”

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多