0

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

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

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

4

1 回答 1

1

这是一个多步骤的过程:

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

    • 您提到了 Google 的地理编码 API。这会很好,还有其他几个可供选择。
  2. 使用这些方法中的任何一种从这些坐标中确定时区标识符。

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

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

      // 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"

另外,如果要获取实际的 string "(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna",则:

  • 如果在 Windows 上,并且 Windows 操作系统语言环境是English,那么你可以.DisplayNameTimeZoneInfo对象中获取。

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

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

此外,您可能会考虑使用NodaTime代替TimeZoneInfo对象。

于 2020-06-16T17:04:46.993 回答