【问题标题】:Map an address to a Windows Timezone将地址映射到 Windows 时区
【发布时间】:2020-06-16 13:23:11
【问题描述】:

我正在研究将诸如地址之类的位置映射到 Windows 时区格式。例如,如果地址包含哥本哈根市,则服务应将其映射到 (UTC+01:00) 布鲁塞尔、哥本哈根、马德里、巴黎。

如果地址包含靠近维也纳的城市,则应将其映射到 (UTC+01:00) 阿姆斯特丹、柏林、伯尔尼、罗马、斯德哥尔摩、维也纳。

我查看了 Google 的 GeoCoding 和 TimeZone API,但它只给了我时区的名称,例如“中欧时间”。

【问题讨论】:

    标签: c# timezone google-api-timezone


    【解决方案1】:

    这是一个多步骤的过程:

    1. 确定该位置的经纬度坐标。

      • 您提到了 Google 的地理编码 API。这样就可以了,还有其他几个可供选择。
    2. 使用any of these methods 从这些坐标中确定时区标识符。

      • 在大多数情况下,您会收到一个 IANA 时区标识符,例如 "Europe/Vienna"。您提到了 Google 时区 API - 它在 timeZoneId 字段中返回此值(不是 timeZoneName)。
    3. 使用 IANA 时区标识符获取 .NET TimeZoneInfo 对象。

      • 如果您在非 Windows 平台(Linux、OSX 等)上运行 .NET,则可以直接从 IANA 时区标识符获取 TimeZoneInfo 对象:

        // This will work on platforms that use IANA time zones natively
        TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Europe/Vienna");
        
      • 如果您在 Windows 上运行 .NET,或者想要编写您的应用程序以在 任何 平台上运行,请使用我的 TimeZoneConverter 库来检索 TimeZoneInfo 对象:

        // This will work on any platform
        TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo("Europe/Vienna");
        

    如果您确实需要 Windows 时区标识符,那么 TimeZoneConverter 也可以这样做:

    string tz = TZConvert.IanaToWindows("Europe/Vienna");
    //=> "W. Europe Standard Time"
    

    另外,如果你想得到实际的字符串"(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna",那么:

    • 如果在 Windows 上,并且 Windows 操作系统区域设置是 English,那么您可以从 TimeZoneInfo 对象中获取 .DisplayName

    • 在所有其他情况下,您可以跳过上面的第 3 步,直接使用我的 TimeZoneNames 库,其中包含所有语言的所有显示名称:

      string displayName = TZNames.GetDisplayNameForTimeZone("Europe/Vienna", "en");
      

    另外,您可以考虑使用NodaTime 代替TimeZoneInfo 对象。

    【讨论】:

    • 感谢马特的详细答案。我完全了解并已完成步骤 1-2,但步骤 3 中的描述对我来说是新的。我会尽快实现它并回到这篇文章。
    • 嗨,马特,我仍在研究,但到目前为止,这种方法 "TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo("Europe/Vienna")" 对我来说适用于我的个人笔记本电脑,其中设置了区域设置到英语。我必须看看它在 Azure Function for .NET Core 运行时中运行时的行为。我试图了解所有这些术语,IANA、Windows 时区标识符、CLDR、POSIX、tz、NodaTime 等。
    • 取回tzi后你会做什么
    • 目前我只是将它存储在 i 列数据库中。我注意到找不到 TZConvert.GetTimeZoneInfo("Central European Summer Time") 。我已经更新了我的 Win 10 并使用 tzutil /l 检查了 Windows 注册表中的时区名称列表,而这个中欧夏令时实际上并不存在。但它是有效的时区名称。
    • 如果我尝试从 NodaTime 库中获取时区名称“Central European Summer Time”,它也找不到这个时区:DateTimeZoneProviders.Tzdb["Central European Summer Time"]
    猜你喜欢
    • 1970-01-01
    • 2019-02-24
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2011-06-25
    • 2016-10-11
    相关资源
    最近更新 更多