String zoneId = Calendar.getInstance().getTimeZone().toZoneId();
Я хочу получить String [] с кодом ISO страны, например «AS», «AL», «AU», для которых применяется zoneId?
Он не компилируется, поскольку toZoneId() возвращает ZoneId (не String; но вы можете добавить .toString(), чтобы он был). @ Paolof76: имеет смысл, если идентификатор зоны находится в формате региона / города, например Pacific / Honolulu, как и должно быть. Но боюсь, что для этого потребуется база данных по географии.
Есть ли какой-либо сторонний API или что-то, что преобразует формат «регион / город» в соответствующий ISO-код страны или название страны.




Я думаю, что лучшая альтернатива - получить эти файлы IANA:
Эти файлы имеют записи в следующем формате:
#codes coordinates TZ comments
AD +4230+00131 Europe/Andorra
AE,OM +2518+05518 Asia/Dubai
AF +3431+06912 Asia/Kabul
Если я не ошибаюсь, zone1970.tab новее и охватывает случаи, когда часовой пояс используется более чем в одной стране, но вы можете проверить оба и посмотреть, какой из них решает вашу проблему.
И есть также файл iso3166.tab, который сопоставляет коды стран с их соответствующими названиями.
Я не уверен, есть ли у Java API, который напрямую читает эти файлы, но, глядя на их форматы, кажется, что их легко прочитать и найти нужную информацию.
Быстрая заметка: звонить в Calendar.getInstance().getTimeZone().toZoneId() не нужно.
Если вы хотите, чтобы часовой пояс JVM по умолчанию был объектом ZoneId, просто вызовите ZoneId.systemDefault(). Если вы хотите, чтобы идентификатор зоны был String (например, Europe/Berlin или America/New_York), просто позвоните в ZoneId.systemDefault().getId().
Имеет ли это смысл? Есть больше стран для одного часового пояса ... см. Javadocs для ZoneIds: docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html