java.time.DateTimeException: неверный идентификатор для ZoneId на основе региона, неправильный формат: Java - PullRequest
0 голосов
/ 30 мая 2019

Я хочу получить по городу UTC и времени по Гринвичу без подчеркивания . Во-первых, я пишу, чтобы получить идентификаторы зоны:

 List<String> utc = new ArrayList<>(ZoneId.getAvailableZoneIds());
 List<String> gmt = new ArrayList<>(ZoneId.getAvailableZoneIds());

Но у меня есть подчеркивание, и я перехожу на пустое место:

  List<String> newList_utc = new ArrayList<>();
  List<String> newList_gmt = new ArrayList<>();

    for (String anUtc : utc) {
        if (anUtc.contains("_")) {
            newList_utc.add(anUtc.replace("_", " "));
        } else {
            newList_utc.add(anUtc);
        }
    }

    for (String aGmt : gmt) {
        if (aGmt.contains("_")) {
            newList_gmt.add(aGmt.replace("_", " "));
        } else {
            newList_gmt.add(aGmt);
        }
    }

После разделения у меня есть конкретный город, например - El Salvador. До разбиения и изменения был America/El_Salvador в качестве формата.

И я использую следующий код для вывода часовых поясов со смещением:

newList_utc.stream().filter(it -> it.contains("El Salvador")).collect(Collectors.toList());
newList_utc.stream().filter(it -> it.contains("America/El Salvador")).map(Class::getOffset).collect(Collectors.toList());

...
...

private static String getOffset(String zone) {
       ZonedDateTime zdt = LDT.atZone(ZoneId.of(zone));
       return zdt.getOffset().getId().replace("Z", "+00:00");
}

Наконец, я получаю сообщение об ошибке:

java.time.DateTimeException: Invalid ID for region-based ZoneId, invalid format: America/El Salvador
    at java.time.ZoneRegion.checkName(ZoneRegion.java:151)
    at java.time.ZoneRegion.ofId(ZoneRegion.java:116)
    at java.time.ZoneId.of(ZoneId.java:411)
    at java.time.ZoneId.of(ZoneId.java:359)
    at project.Bot.getOffset(Bot.java:5822)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at project.Bot.getOutputZone(Bot.java:6070)
    at project.Bot.getTimeZone(Bot.java:6041)
    at project.Bot.onUpdateReceived(Bot.java:399)

Во время отладки это происходит из-за метода getOffset() в этой строке ZonedDateTime zdt = LDT.atZone(ZoneId.of(zone));, где я установил America/El Salvador. Если я напишу America/El_Salvador, то у меня нет этой проблемы.

Но почему я не могу использовать пустое место вместо подчеркивания?

1 Ответ

2 голосов
/ 01 июня 2019

Идентификаторы часовых поясов на самом деле не определены стандартом Java, но вне Java в наборе данных, известном как база данных tz , которая является стандартом часового пояса общественного достояния, разработанным для взаимодействия между приложениями и языками программирования..

Правила имен часовых поясов:

Часовые пояса имеют уникальные имена в форме «Область / Местоположение», например, «Америка / Нью-Йорк».Был также сделан выбор использовать английские имена или эквиваленты и исключать знаки препинания и общие суффиксы. Символ подчеркивания используется вместо пробелов. Дефисы используются там, где они появляются в названии местоположения.Имена Area и Location имеют максимальную длину 14 символов.

Таким образом, подчеркивание требуется в зависимости от формата, поэтому использование часовых поясов с пробелами вместо подчеркивания не будет работать, а не потому, что Java нене поддерживается, но поскольку для него нет соответствующей записи tz.

Если вы хотите преобразовать из tz в чистый дисплей, вы можете заменить подчеркивание пробелом, и наоборот, чтобы преобразоватьочистить дисплей обратно в идентификатор часового пояса.

Ссылка: относительно текущие коды tz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...