Получить местный часовой пояс, используя название города в Java - PullRequest
0 голосов
/ 18 апреля 2019

Используя названия городов (например, Абу-Даби, Сидней, Дакка, Париж и т. Д.), Необходимо найти местный часовой пояс.Можно использовать 2-значный код страны

1 Ответ

1 голос
/ 01 мая 2019

Для решения, охватывающего все мыслимые названия городов, для этого потребуется база данных, содержащая города и соответствующие им часовые пояса.Это будет еще более осложняться тем фактом, что существуют города с одинаковыми названиями, поэтому вы можете иметь неоднозначный вклад.Например, под Парижем я предполагаю, что вы предполагали столицу и самый большой город Франции - Европу, но города под названием Париж существуют и в других местах.Я не знаю, существует ли подходящая база данных, вы можете поискать.

Я могу, однако, приблизить вас к тому, что встроено в Java.Часовые пояса имеют идентификаторы в виде регион / город , например Australia/Sydney и Asia/Dubai.Город, используемый в названии часового пояса, является наибольшим населенным районом часового пояса, поэтому даже в случае, когда страна или штат является только одним часовым поясом, город не обязательно должен быть столицей.Но если город совпадает, мы можем найти зону.

    Set<String> zids = ZoneId.getAvailableZoneIds();

    String[] cityNames = { "Abu Dhabi", "Dubai", "Sydney", "Dhaka", "Paris", "Indianapolis", "São Tomé" };
    for (String cityName : cityNames) {
        String tzCityName = Normalizer.normalize(cityName, Normalizer.Form.NFKD)
                .replaceAll("[^\\p{ASCII}-_ ]", "")
                .replace(' ', '_');
        List<String> possibleTimeZones = zids.stream()
                .filter(zid -> zid.endsWith("/" + tzCityName))
                .collect(Collectors.toList());
        System.out.format("%-12s %s%n", cityName, possibleTimeZones);
    }

Вывод этого фрагмента:

Abu Dhabi    []
Dubai        [Asia/Dubai]
Sydney       [Australia/Sydney]
Dhaka        [Asia/Dhaka]
Paris        [Europe/Paris]
Indianapolis [America/Indianapolis, America/Indiana/Indianapolis]
São Tomé     [Africa/Sao_Tome]

Однако вы заметите, что он не нашел ни однойчасовой пояс для Абу-Даби, потому что, хотя столица Объединенных Арабских Эмиратов, это не самый большой город;Дубай есть.Вы также заметите, что для Индианаполиса были найдены два часовых пояса.Первый - это просто псевдоним второго.

Названия городов, используемые в базе данных часовых поясов, - это английские названия (если они существуют) без акцентов.Когда имя состоит из двух или трех слов, они разделяются подчеркиванием, а не пробелами.Так Сан-Томе становится Sao_Tome.Поэтому в коде я выполняю это преобразование.Способ снять акценты был взят из другого ответа переполнения стека, ссылка ниже.

Ссылки

...