JSR-310 поставляется с Java 8, который обеспечивает расширенную поддержку синтаксического анализа временных значений, где компоненты теперь могут быть необязательными.Вы можете не только сделать зону необязательной, но вы также можете сделать компонент времени необязательным и вернуть правильную временную единицу для данной строки.
Рассмотрим следующие тестовые примеры.
public class DateFormatTest {
private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"yyyy-MM-dd[[ ]['T']HH:mm[:ss][XXX]]");
private TemporalAccessor parse(String v) {
return formatter.parseBest(v,
ZonedDateTime::from,
LocalDateTime::from,
LocalDate::from);
}
@Test public void testDateTime1() {
assertEquals(LocalDateTime.of(2014, 9, 23, 14, 20, 59),
parse("2014-09-23T14:20:59"));
}
@Test public void testDateTime2() {
assertEquals(LocalDateTime.of(2014, 9, 23, 14, 20),
parse("2014-09-23 14:20"));
}
@Test public void testDateOnly() {
assertEquals(LocalDate.of(2014, 9, 23), parse("2014-09-23"));
}
@Test public void testZonedDateTime() {
assertEquals(ZonedDateTime.of(2014, 9, 23, 14, 20, 59, 0,
ZoneOffset.ofHoursMinutes(10, 30)),
parse("2014-09-23T14:20:59+10:30"));
}
}
Здесь шаблон DateTimeFormatter , равный "yyyy-MM-dd[[ ]['T']HH:mm[:ss][XXX]]"
, допускает дополнительные параметры в квадратных скобках, которые также могут быть вложенными.Шаблоны также могут быть построены из DateTimeFormatterBuilder , который здесь демонстрируется вышеупомянутым шаблоном:
private final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.optionalStart()
.optionalStart()
.appendLiteral(' ')
.optionalEnd()
.optionalStart()
.appendLiteral('T')
.optionalEnd()
.appendOptional(DateTimeFormatter.ISO_TIME)
.toFormatter();
Это будет преобразовано в выражение, которое выглядит следующим образом:
yyyy-MM-dd[[' ']['T']HH:mm[':'ss[.SSS]]].
Дополнительные значения могут быть вложенными и автоматически закрываться в конце, если они все еще открыты.Тем не менее, обратите внимание, что не существует способа предоставить исключающее ИЛИ для необязательных частей, поэтому приведенный выше формат на самом деле будет достаточно хорошо разбирать следующее значение:
2018-03-08 T11:12
Обратите внимание на действительно полезную возможность, которую мы можем использовать в существующем форматере какчасти нашего текущего формата.