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 ПО ВОСТОЧНОМУ ВРЕМЕНИ
Поэтому я считаю, что в поведении нет ничегоделать с сообщением об ошибке, на которое вы ссылались.
Ссылки