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