2015-09-12 3 views
9

Java, 8 DateTimeFormatter создаются из шаблона, как d. MMM u можно только разобрать даты с месяцем, написанным в стиле определенного TextStyle.SHORT (например 13. Feb 2015), в DateTimeFormatter созданного из d. MMMM u может только синтаксический анализ даты с месяцем, написанным в стиле определенного по TextStyle.FULL (например, 13. February 2015).Возможно ли разобрать даты как с TextStyle.SHORT, так и с TextStyle.FULL за месяц?

В «старом» SimpleDateFormat разница между «MMM» и «MMMM» была важна только для форматирования, а не для синтаксического анализа, поэтому было легко создать парсер, который понимал бы как FULL, так и SHORT месячные имена.

Возможно ли создать Java 8 DateTimeFormatter, который также может это сделать? Или мне всегда приходится создавать два парсера, один с FULL и один с шаблоном SHORT?

ответ

6

Вы могли бы сделать различные месяц модели опционально:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d. [MMMM][MMM] u HH:mm:ss z", Locale.US); 

    ZonedDateTime zdt1 = ZonedDateTime.parse("4. Jan 2015 00:00:00 UTC", formatter); 
    ZonedDateTime zdt2 = ZonedDateTime.parse("4. January 2015 00:00:00 UTC", formatter); 

    System.out.println(zdt1); 
    System.out.println(zdt2); 

Выход:

2015-01-04T00:00Z[UTC] 
2015-01-04T00:00Z[UTC] 

EDIT

Это верстальщик может быть использован только для parse(), вы будете иметь использовать другой для format().

+0

Хорошо, единственное, что я вижу, это то, что теперь он может разбирать «сломанные» строки, такие как «15. JanuaryJan 2015», но это не большая проблема. Еще не определился, если два Форттера/Парсера могут быть не более элегантным решением ... – David

+0

@David Я бы сказал, что если у вас всего два, на самом деле не важно, какое решение вы выберете. Но если есть вероятность, что вам нужно разобрать больше типов форматов, вам, вероятно, следует выбрать один синтаксический анализатор и один форматировщик (вы можете даже вложить дополнительные части). – Cinnam