2015-06-08 2 views
9

Я пытаюсь разобрать: 2014-05-02-10.45.05.993280-5:00 где -5:00 - это смещение от UTC. Использование java.time DateTimeFormatter в Java 8.java.time DateTimeFormatter шаблон для смещения временной зоны

Для первого бита у меня есть следующее: yyyy-MM-dd-HH.mm.ss.SSSSSS Однако я не могу понять, какой шаблон должен также анализировать смещение.

Если у меня было смещение с 4 цифрами (-05: 00), я мог бы использовать: yyyy-MM-dd-HH.mm.ss.SSSSSSxxx, но это не работает на 3 цифры.

Любые идеи?

+1

Какую версию Java вы используете? –

+0

@JonSkeet - извините, обновленный оригинальный пост. – Cheetah

ответ

9

Используйте прописную букву 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 не кажется, доступный хотя.

+0

Шаблон не работает ... но ссылка на ошибку выглядит как моя проблема. Я попробовал предложение строителя, но это тоже не работало. – Cheetah

+0

@ Чиета. Вы правы. Извините, что вы страдаете от ошибки. См. Также мое обновление, если вы можете использовать любой из альтернативных обходных решений. –

2

Смещение для SimpleDateFormat знака Z проверка Java7 или Java8SimpleDateFormat API.

Затем ваш формат анализатор для String

2014-05-02-10.45.05.993280-5:00 

должны быть:

yyyy-MM-dd-HH.mm.ss.SSSSSSZ 

UPDATE: для DateTimeFormatter офсетные Шаблоны для форматирования и разбора являются:

O  localized zone-offset  offset-O   GMT+8; GMT+08:00; UTC-08:00; 
X  zone-offset 'Z' for zero offset-X   Z; -08; -0830; -08:30; -083015; -08:30:15; 
x  zone-offset     offset-x   +0000; -08; -0830; -08:30; -083015; -08:30:15; 
Z  zone-offset     offset-Z   +0000; -0800; -08:00; 

Ваш желаемый образец в DateTimeFormatter: X.

+0

Я использую 'DateTimeFormatter', и добавление' Z' не появляется в работе – Cheetah

+1

Вы дважды связаны с Java 7. [Java 8 API здесь.] (Http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html) – dcsohl

Смежные вопросы