我正在研究将诸如地址之类的位置映射到 Windows 时区格式。例如,如果地址包含哥本哈根市,则服务应将其映射到 (UTC+01:00) 布鲁塞尔、哥本哈根、马德里、巴黎。
如果地址包含靠近维也纳的城市,则应将其映射到 (UTC+01:00) 阿姆斯特丹、柏林、伯尔尼、罗马、斯德哥尔摩、维也纳。
我查看了 Google 的 GeoCoding 和 TimeZone API,但它只给了我时区的名称,例如“中欧时间”。
我正在研究将诸如地址之类的位置映射到 Windows 时区格式。例如,如果地址包含哥本哈根市,则服务应将其映射到 (UTC+01:00) 布鲁塞尔、哥本哈根、马德里、巴黎。
如果地址包含靠近维也纳的城市,则应将其映射到 (UTC+01:00) 阿姆斯特丹、柏林、伯尔尼、罗马、斯德哥尔摩、维也纳。
我查看了 Google 的 GeoCoding 和 TimeZone API,但它只给了我时区的名称,例如“中欧时间”。
这是一个多步骤的过程:
确定位置的纬度和经度坐标。
使用这些方法中的任何一种从这些坐标中确定时区标识符。
"Europe/Vienna"
. timeZoneId
您提到了 Google time zone API - 它在字段中返回此值( not timeZoneName
)。使用 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,那么你可以.DisplayName
从TimeZoneInfo
对象中获取。
在所有其他情况下,您可以跳过上面的第 3 步,只使用我的TimeZoneNames库,其中包含所有语言的所有显示名称:
string displayName = TZNames.GetDisplayNameForTimeZone("Europe/Vienna", "en");
此外,您可能会考虑使用NodaTime代替TimeZoneInfo
对象。