gpt4 book ai didi

sql-server - Azure Maps 和 SQL AT TIME ZONE 夏威夷时区不兼容

转载 作者:行者123 更新时间:2023-12-03 05:02:37 33 4
gpt4 key购买 nike

我刚刚在使用 Azure Maps 为时区提供的数据尝试使用 AT TIME ZONE 获取 SQL Server (Azure SQL) 中的本地时间时遇到了问题。

当我向 Azure map 提供夏威夷位置的纬度/经度数据时,返回结果显示“夏威夷-阿留申标准时间”:

"Names":{  
"ISO6391LanguageCode":"en",
"Generic":"Hawaii-Aleutian Time",
"Standard":"Hawaii-Aleutian Standard Time",
"Daylight":"Hawaii-Aleutian Daylight Time"
},

在系统的另一部分,我需要能够确定 SQL Server 中该位置的本地时间,因此我使用 AT TIME ZONE 并注入(inject)标准时区。这对于我正在处理的美国时区(例如“东部标准时间”或“中部标准时间”)非常有用。当它到达夏威夷位置时......它会出错并说它不是有效的时区。

查看我能够在线找到的 SQL Server 时区列表,发现 SQL 中的夏威夷时区是“夏威夷标准时间”。

还有其他人遇到过这种脱节吗?

我想我需要纠正一些异常代码,以将 Azure 提供的时区替换为“夏威夷标准时间”。有更好的解决办法吗?

以下是示例 URL(减号键)供引用:https://atlas.microsoft.com/timezone/byCooperatives/json?subscription-key={key}&api-version=1.0&options=all&query=21.4500 ,-158.0054

这是返回的完整 JSON:

{
"Version": "2018g",
"ReferenceUtcTimestamp": "2018-12-08T17:10:31.8007137Z",
"TimeZones": [
{
"Id": "Pacific/Honolulu",
"Aliases": [
"Pacific/Johnston",
"US/Hawaii"
],
"Countries": [
{
"Name": "United States",
"Code": "US"
},
{
"Name": "US minor outlying islands",
"Code": "UM"
}
],
"Names": {
"ISO6391LanguageCode": "en",
"Generic": "Hawaii-Aleutian Time",
"Standard": "Hawaii-Aleutian Standard Time",
"Daylight": "Hawaii-Aleutian Daylight Time"
},
"ReferenceTime": {
"Tag": "HST",
"StandardOffset": "-10:00:00",
"DaylightSavings": "00:00:00",
"WallTime": "2018-12-08T07:10:31.8007137-10:00",
"PosixTzValidYear": 2018,
"PosixTz": "HST+10"
},
"RepresentativePoint": {
"Latitude": 21.306944444444444,
"Longitude": -157.85833333333332
},
"TimeTransitions": [
{
"Tag": "HST",
"StandardOffset": "-10:00:00",
"DaylightSavings": "00:00:00",
"UtcStart": "1947-06-08T12:30:00Z",
"UtcEnd": "9999-12-31T23:59:59.9999999Z"
}
]
}
]
}

最佳答案

Names 部分中返回的字符串不是标识符。它们是源自 Unicode CLDR 的本地化字符串。 ,并且旨在向最终用户显示。虽然其中一些在以英语呈现时可能与标识符对齐,但不能保证这一点。

它们也不是任意选择的。根据 15 USC 260 ( and described on Wikipedia here ) 的定义,“夏威夷-阿留申时间”确实是该时区的法定名称。

另一方面,SQL Server 的时区功能严格依赖于 Windows 时区标识符,可以在 Windows 注册表中或通过各种 API(例如 .NET 的 TimeZoneInfo.Id)找到该标识符。和命令行实用程序(例如在 TZUTIL/L 返回的每对结果的第一行)。

不幸的是,Azure Maps API 目前似乎只返回 IANA ID,而不是相应的 Windows ID。我已要求 Azure Maps API 团队考虑在未来版本中添加此功能。

同时,您可以将 IANA ID 转换为相应的 Windows ID,然后再在 SQL Server 中使用。假设您在 .NET 应用程序中,最简单的方法是使用我的 TimeZoneConverter图书馆:

string tz = TZConvert.IanaToWindows("Pacific/Honolulu");  //=>  "Hawaiian Standard Time"

如果您不在 .NET 中,则可以使用 Windows 中内置的文件,路径为:

C:\Windows\Globalization\Time Zone\timezoneMapping.xml

该文件的条目如下所示:

<MapTZ TZID="Pacific/Honolulu" WinID="Hawaiian Standard Time" Region="001" Default="true" StdPath="Hawaii_Aleutian/standard" DltPath="Hawaii_Aleutian/daylight" />

您只需使用 TZIDWinID 属性即可进行该方向的映射。

或者,您可以使用 CLDR 的 /common/supplemental/windowsZones.xml 文件,因为这是权威来源。开发主干版本位于here 。它的数据看起来很相似,但属性的命名不同:

<mapZone other="Hawaiian Standard Time" territory="001" type="Pacific/Honolulu"/>

关于sql-server - Azure Maps 和 SQL AT TIME ZONE 夏威夷时区不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53673464/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com