Сопоставьте адрес с часовым поясом Windows - PullRequest
0 голосов
/ 16 июня 2020

Я собираюсь сопоставить местоположение, например адрес, с форматом Windows TimeZone. Например, если адрес содержит город Копенгаген, тогда служба должна сопоставить его с (UTC + 01: 00) Брюсселем, Копенгагеном, Мадридом, Парижем.

Если адрес содержит город, близкий к Вене, тогда он должен сопоставьте его с (UTC + 01: 00) Амстердамом, Берлином, Берном, Римом, Стокгольмом, Веной.

Я изучал API Google GeoCoding и TimeZone, но он дает мне только название часового пояса, например " Центральноевропейское время ».

1 Ответ

1 голос
/ 16 июня 2020

Это многоэтапный процесс:

  1. Определите координаты широты и долготы местоположения.

    • Вы упомянули API геокодирования Google. Это подойдет, и есть несколько других вариантов на выбор.
  2. Определите идентификатор часового пояса по этим координатам, используя любой из этих методов .

    • В большинстве случаев вы получите идентификатор часового пояса IANA, например "Europe/Vienna". Вы упомянули API часового пояса Google, который возвращает это значение в поле timeZoneId ( не timeZoneName).
  3. Используйте время IANA идентификатор зоны для получения объекта. NET TimeZoneInfo.

    • Если вы работаете. NET на платформе, отличной от Windows (Linux, OSX и т. д. c.) Вы можете получить объект TimeZoneInfo непосредственно из идентификатора часового пояса IANA:

      // This will work on platforms that use IANA time zones natively
      TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Europe/Vienna");
      
    • Если вы работаете. NET на Windows, или хотите написать свое приложение для работы на любой платформе , а затем используйте мою 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 - Engli sh, то вы можете просто получить .DisplayName из TimeZoneInfo объект.

  • * 106 6 * Во всех остальных случаях вы можете пропустить шаг 3 выше и просто использовать мою TimeZoneNames библиотеку, в которой есть все отображаемые имена для всех языков:
    string displayName = TZNames.GetDisplayNameForTimeZone("Europe/Vienna", "en");
    

Кроме того, вы можете рассмотреть возможность использования NodaTime вместо объекта TimeZoneInfo.

...