Вопрос по simpledateformat, timezone, java-time, java – Я отредактировал ваш ответ для форматирования, но все еще не вижу, как это решает вопрос, который был задан.

2

ли найти список идентификаторов часовых поясов для данного сокращения часового пояса? Например, для сокращенияIST, идентификаторы часовых поясовAsia/Jerusalem, Asia/Kolkata а такжеEurope/Dublin.

Ваш Ответ

1   ответ
3

не может быть ни авторитетного ответа, ни пуленепробиваемого способа получить такой ответ. Сверху головы я подумал о двух подходах:

Получить их от вашего JVM.Найти их в сети.

Получение зон от вашей JVM:

    String givenAbbr = "IST";
    LocalDateTime summerSouthernHemisphere = LocalDate.of(2018, Month.JANUARY, 31).atStartOfDay();
    LocalDateTime summerNorthernHemisphere = LocalDate.of(2018, Month.JULY, 31).atStartOfDay();
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("z");
    Set<ZoneId> zones = new HashSet<>();
    for (String id : ZoneId.getAvailableZoneIds()) {
        ZoneId zone = ZoneId.of(id);
        String abbr = summerSouthernHemisphere.atZone(zone).format(dtf);
        if (abbr.equals(givenAbbr)) {
            zones.add(zone);
        }
        abbr = summerNorthernHemisphere.atZone(zone).format(dtf);
        if (abbr.equals(givenAbbr)) {
            zones.add(zone);
        }
    }
    System.out.println(zones);

Это печатает:

[Asia/Calcutta, Eire, Europe/Dublin, Asia/Jerusalem, Asia/Tel_Aviv, Israel, Asia/Kolkata, Asia/Colombo]

Некоторые из них являются просто названиями для одного и того же часового пояса. Например, Eire имеет те же правила, что и Европа / Дублин. Таким образом, при желании можно выполнить дополнительную фильтрацию. Вы можете использоватьoneZoneId.getRules().equals(anotherZoneId.getRules()) определить, если дваZoneId объекты имеют одинаковые правила зоны.

Для аббревиатуры CST список еще длиннее и имеет больше синонимов:

[PRC, America/Matamoros, Asia/Taipei, America/Regina, America/El_Salvador,
        America/North_Dakota/New_Salem, Asia/Harbin, America/Costa_Rica,
        America/North_Dakota/Center, America/Guatemala, America/Winnipeg,
        Asia/Chongqing, America/Rankin_Inlet, America/Indiana/Knox,
        America/Belize, SystemV/CST6CDT, Mexico/General,
        America/North_Dakota/Beulah, CST6CDT, America/Swift_Current,
        America/Knox_IN, Asia/Chungking, Asia/Macao, Asia/Shanghai,
        America/Indiana/Tell_City, America/Menominee, America/Bahia_Banderas,
        America/Managua, Canada/East-Saskatchewan, Asia/Macau, America/Havana,
        America/Resolute, US/Central, US/Indiana-Starke, Cuba, America/Monterrey,
        America/Chicago, America/Merida, America/Mexico_City, Canada/Central,
        America/Tegucigalpa, America/Rainy_River, Canada/Saskatchewan, SystemV/CST6]

Одним из ограничений моего подхода является то, что некоторые часовые пояса известны более чем одному имени и, следовательно, более чем одной трех или четырехбуквенной аббревиатуре. Мой код выше ловит только один из них.

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

Получить их из Интернета

Другой ответ, конечно, тот, который, по вашему поиску, уже вызван: такие списки общедоступны в Интернете. НапримерСписок сокращений часовых поясов в Википедии а такжеСокращения Часового пояса - Мировой Список на timeanddate.com, Как и ожидалось, два упомянутых списка не согласны. Например, последний знает две интерпретации ADT, первая только одна. Последний список дает много аббревиатур синонимов и тем самым иллюстрирует мою точку зрения выше, что каждая зона может иметь более одной аббревиатуры.

Похожие вопросы