Карты Azure и SQL AT TIME ZONE несовместимый часовой пояс для Гавайев - PullRequest
0 голосов
/ 07 декабря 2018

Я только что столкнулся с проблемой при использовании данных, которые Azure Maps предоставляет для часовых поясов, чтобы попытаться получить местное время в SQL Server (Azure SQL), используя AT TIME ZONE.

Когда я предоставляю данные широты и долготы в Azure Maps для местоположения на Гавайях, в ответе указывается «Гавайско-алеутское стандартное время»:

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

В другой части моей системы мне нужновозможность определить местное время для этого местоположения в SQL Server, поэтому я использую AT TIME ZONE и внедряю стандартный часовой пояс.Это прекрасно работает для часовых поясов США, с которыми я имею дело, таких как «Восточное стандартное время» или «Центральное стандартное время».Когда он попадает в гавайское местоположение ... он выдает ошибку и говорит, что это недопустимый часовой пояс.

Просматривая списки часовых поясов, которые мне удалось найти в Интернете для SQL Server, выясняется, чтоЧасовой пояс Гавайев в SQL - это «Гавайское стандартное время».

Кто-нибудь еще сталкивался с этим разъединением?

Думаю, мне нужно исправить код исключения, чтобы заменить этот часовой пояс, предоставленный Azure, на "Гавайское стандартное время".Есть ли лучшее решение?

Для справки вот пример URL (минус ключ): https://atlas.microsoft.com/timezone/byCoordinates/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"
        }
      ]
    }
  ]
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Строки, возвращаемые в разделе Names, не являются идентификаторами.Это локализованные строки, которые происходят из Unicode CLDR и предназначены для отображения конечным пользователям.Хотя некоторые из них могут соответствовать идентификаторам, когда они представлены на английском языке, это не гарантируется.

Они также не выбраны произвольно.«Гавайско-алеутское время» действительно является официальным названием этого часового пояса, как определено в 15 USC 260 ( и описано в Википедии здесь ).

С другой стороны, время SQL ServerФункциональность зоны зависит исключительно от идентификаторов часовых поясов Windows, которые можно найти в реестре Windows, или от различных API (таких как .NET TimeZoneInfo.Id) и служебных программ командной строки (например, в первой строке каждой пары результатов, возвращаемыхTZUTIL /L).

К сожалению, похоже, что API Карт Azure в настоящее время возвращает только идентификатор IANA, а не соответствующий идентификатор Windows.Я попросил группу API Azure Maps рассмотреть возможность добавления этого в будущем выпуске.

Тем временем вы можете преобразовать идентификатор IANA в соответствующий идентификатор Windows, прежде чем использовать его в 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" />

Вы бы просто использовали атрибуты TZID и WinIDчтобы выполнить сопоставление в этом направлении.

В качестве альтернативы, вы можете использовать файл CLDR /common/supplemental/windowsZones.xml, так как это официальный источник.Версия ствола разработчика находится здесь .Его данные выглядят одинаково, но атрибуты имеют разные имена:

<mapZone other="Hawaiian Standard Time" territory="001" type="Pacific/Honolulu"/>
0 голосов
/ 10 декабря 2018

Хорошо, "Pacific / Honolulu" - это код IANA.Согласно некоторым документам SQL, он поддерживает все часовые пояса Windows, в то время как другие говорят, что он поддерживает только часовые пояса в реестре компьютера, которые могут варьироваться от компьютера к компьютеру.Физически проверяя свою машину, я вижу, что SQL поддерживает 137 часовых поясов (выберите * из sys.time_zone_info).Однако, согласно документации Windows, он имеет 250 часовых поясов по умолчанию (плюс несколько расширенных).Определенно есть разъединение где-то, но это больше похоже на разъединение Windows / SQL.

Тем не менее, похоже, что "Гавайское стандартное время" и "Гавайско-алеутское стандартное время" одинаковы: https://www.timeanddate.com/time/zones/hast

Однако, когда речь идет о переходе на летнее время, он получаетнамного более сложный: https://www.timeanddate.com/time/zones/hadt

Я передам эту тему команде разработчиков и специалистов по картам Azure для более глубокого изучения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...