【问题标题】:How to get the TimeZone for metazones by using FindSystemTimeZoneById?如何使用 FindSystemTimeZoneById 获取元区域的时区?
【发布时间】:2011-06-16 23:26:43
【问题描述】:

我获得了 TzID(Olson tzid 格式 Exp:“Europe/Copenhagen”)。之后,我尝试使用 c# TimeZonInfo 类将某个 DateTime 从该时区(与服务器本地时区不同)转换为 UTC。

我想知道为什么 window 的时区 id 只有大约 100,而 Olson 的时区 id tz 数据库大约有 405 tz id。假设时区“欧洲/哥本哈根”,我不知道如何使用 FindSystemTimeZonebyID 来获取该时区的时区信息(它在 Olson ID to windows ID convertion table 的元区中列出)。有人有这方面的经验吗?请帮帮我。

【问题讨论】:

    标签: c# windows datetime timezone registry


    【解决方案1】:

    From MSDN:

    FindSystemTimeZoneById 尝试将 id 匹配到 Windows XP 和 Windows Vista 下注册表的 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones 分支的子键名称。此分支不一定包含时区标识符的完整列表。

    根据您链接到的表,您希望传入字符串Europe_Central,因为它是Olson“欧洲/哥本哈根”的Windows 版本。 (请注意,根据 MSDN 文档,它不区分大小写。)如果这不起作用,您应该检查您的注册表以确保存在 Europe_Central 条目。

    有关 Olson tz 数据库以及它如何定义时区的更多信息,请参阅wikipedia


    更新 1:

    我的注册表 (Vista) 将它列为 Central Europe Standard Time,这是我需要作为参数传入的字符串,你有类似的条目吗?

    如果该条目不在您的注册表中,您可以使用来自here 的信息来create it yourself,尽管看起来您必须为夏季时间构建规则(请参阅链接)。

    您也可以尝试使用 DateTimeOffsetDateTime 来保存本地服务器时间并传入 +1 小时 (CET) 的 TimeSpan

    根据您要执行的操作,您也可以从 CET 时间中减去一小时来获得 UTC。 (虽然Central Europe Summer Time 生效后这将不起作用;那么您需要减去两个小时。)

    【讨论】:

    • 非常感谢您的回复。我使用路径“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones”检查了注册表,发现即使在时区注册表更新后,“Europe_Central”的时区注册表也不存在(从support.microsoft.com/kb/979306 下载) .我可以知道如何为那些不存在的人添加时区注册表吗?如果手动添加注册表,似乎太多了。谢谢。
    • @darrell:我添加了一些其他选项供您在 C# 中创建更简单的时间对象。我不知道注册表的结构,并且犹豫是否建议对其进行编辑。也许其他人会知道......祝你好运!
    • 谢谢,我认为使用 TimeZoneInfo.CreateCustomTimeZone 方法创建时区类将比通过编辑注册表设置时区更好、更安全。
    猜你喜欢
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2011-09-12
    • 2022-07-25
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多