Используйте прописную букву X вместо x, следовательно, XXX. Разница в том, что большой X может распознать входную букву «Z» как UTC-Offset +00: 00, в то время как маленькая буква X не может.
Предложенная картина:
yyyy-MM-dd-HH.mm.ss.SSSSSSXXX
Пожалуйста, также известен следующее: JDK-bug
java.time.format.DateTimeFormatter не может анализировать смещение с одной значного часом
ОБНОВЛЕНИЕ:
Теперь я проверил описанное обходное решение в журнале ошибок.
String input = "2014-05-02-10.45.05.993280-5:00";
DateTimeFormatter f = new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS").parseLenient().appendOffset("+HH:MM", "Z").toFormatter();
System.out.println(f.parse(input, ZonedDateTime::from));
Но он бросает исключение:
Исключение в нити "главного" java.time.format.DateTimeParseException: Текст «2014-05-02-10.45.05.993280-5: 00 'не удалось разобрать по индексу 26 по адресу java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:1947) по адресу java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1849) на HelloWorld.main (Привет мир.java: 16)
Такой мягкий синтаксический анализ также не помогает. Так что теперь только три варианта осталась для вас:
Используйте обходной путь предложенной ошибки репортером: [...] временное решение разобрать дату/время отдельно, используйте ручной кодированный анализатор для смещения и объедините LocalDateTime с обработанным вручную смещением. Нелегкая работа.
Попробуйте свою специальную предварительную обработку строк. Если у вас есть фиксированный формат, вы можете попытаться вставить нулевую цифру в позицию 26 (если общая длина ввода слишком мала).
Или вы используете внешнюю библиотеку, которая может это сделать. Моя библиотека Time4J (v4.0) может сделать это, если вы хотите добавить дополнительную зависимость. Смотрите этот код:
String input = "2014-05-02-10.45.05.993280-5:00"; ZonalDateTime zdt = ZonalDateTime.parse( input, Moment.localFormatter("yyyy-MM-dd-HH.mm.ss.SSSSSSXXX", PatternType.CLDR)); System.out.println(zdt); // 2014-05-02T10:45:05,993280UTC-05:00 ZonedDateTime result = zdt.toTemporalAccessor();
Update: Согласно JDK-черепашки-статус, ошибка была исправлена для Java-9, но портировать для Java-8 не кажется, доступный хотя.
Какую версию Java вы используете? –
@JonSkeet - извините, обновленный оригинальный пост. – Cheetah