DateTimeParseException на Java 11, но работает на Java 10 - PullRequest
0 голосов
/ 30 сентября 2018

Следующий тестовый сценарий отлично работает в Java 10:

import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;

class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder().
          appendPattern("EEE, dd MMM yyyy HH:mm:ss zzz").
          toFormatter();
        Instant result = dateFormatter.parse("Sat, 29 Sep 2018 20:49:02 GMT", Instant::from);
        System.out.println("Result: " + result);
    }
}

, но в Java 11 я получаю:

Exception in thread "main" java.time.format.DateTimeParseException: Text 'Sat, 29 Sep 2018 20:49:02 GMT' could not be parsed at index 0
        at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
        at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
        at Test.main(Test.java:13)

Что происходит?

ОБНОВЛЕНИЕ : замена toFormatter() на toFormatter(Locale.US) устраняет проблему.Я предполагаю, что эта проблема связана с https://bugs.openjdk.java.net/browse/JDK-8206980. Эта проблема помечена как исправленная в Java 11 build 23, но я работаю

openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

Разве это нельзя исправить в этой версии?

ОБНОВЛЕНИЕ2 : Если вы не можете воспроизвести проблему, попробуйте заменить toFormatter() на toFormatter(Locale.CANADA).

1 Ответ

0 голосов
/ 30 сентября 2018

DateTimeFormatter.RFC_1123_DATE_TIME

Ваша строка даты и времени представлена ​​в формате RFC 822 / RFC 1123 .Вместо создания своего собственного форматера используйте встроенный DateTimeFormatter.RFC_1123_DATE_TIME:

    Instant result = DateTimeFormatter.RFC_1123_DATE_TIME
            .parse("Sat, 29 Sep 2018 20:49:02 GMT", Instant::from);
    System.out.println("Result: " + result);

Вывод:

Результат: 2018-09-29T20:49: 02Z

Этот форматер RFC 1123 всегда на английском языке, как того требует спецификация RFC.Я даже попытался установить в качестве локали по умолчанию Locale.CANADA_FRENCH, и код все еще работал.

Что пошло не так в вашем коде?

В Java 11 Java ожидает, чтоСокращения для дня недели и для месяца пишутся с точкой в ​​Locale.CANADA: Sat. и Sep. вместо Sat и Sep.В Java 10 они ожидаются без точек, поэтому здесь разбор работает.Разница, вероятно, заключается в разных версиях данных CLDR и вряд ли может считаться ошибкой в ​​любой из упомянутых версий Java.Поскольку Java 9 CLDR был стандартным языковым стандартом в Java, включая то, как сокращения дня и месяца выглядят в разных локалях.

Демонстрация: Использование вашего форматера, но изменение его для использования Locale.CANADA, как вы сказали:

    DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder().
            appendPattern("EEE, dd MMM yyyy HH:mm:ss zzz").
            toFormatter(Locale.CANADA);
    System.out.println("Sample: " + ZonedDateTime.now(ZoneId.of("America/Toronto"))
            .format(dateFormatter));

При работе на Java 10.0.2 печатается без точек:

Образец: Sun, 30 сентября 2018 10:39:28 EDT

И на Java 11 сборка 11 + 28:

Образец: вс., 30 сентября 2018 г. 10:50:29 ПО ВОСТОЧНОМУ ВРЕМЕНИ

Поэтому я считаю, что в поведении нет ничегоделать с сообщением об ошибке, на которое вы ссылались.

Ссылки

...