Ну, это заняло у меня больше времени, чем я ожидал.Единственный допустимый синтаксический анализатор:
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.appendValue(ChronoField.YEAR, 4)
.appendPattern("[['-']MM[['-']dd[['T']HH[[':']mm[[':']ss['.'SSS]]]]]]")
.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.parseDefaulting(ChronoField.NANO_OF_SECOND, 0)
.toFormatter();
String[] s = {
"2018",
"2018-10",
"2018-10-15",
"2018-10-15T12:00",
"2018-10-15T12:00:30",
"2018-10-15T12:00:30.123",
"20181015",
"201810151200",
"20181015120030",
"20181015120030.123",
"20181015T12:00:30.123"
};
for (String line : s) {
System.out.println(LocalDateTime.parse(line, dtf));
}
Проблема в том, что yyyy
создает ValueParser(minWidth=4, maxWidth=19, SignStyle.PAD_EXEEDS)
, который в качестве примера анализирует дату 20181015
как year=20181015
.Таким образом, мы должны ограничить ширину цифры от year
до 4.
Документация гласит:
Год : Количество букв определяет минимальное полеширина, ниже которой используется отступ.
Но не указывается максимальная ширина.