DateTimeFormatter yearMonthFormatter = new DateTimeFormatterBuilder()
.appendValue(ChronoField.MONTH_OF_YEAR, 1, 2, SignStyle.NEVER)
.appendValue(ChronoField.YEAR, 4)
.toFormatter();
System.out.println(YearMonth.parse("112019", yearMonthFormatter));
System.out.println(YearMonth.parse("82019", yearMonthFormatter));
Вывод этого фрагмента:
2019-11
2019-08
Неинтуитивно (но очень практично во многих других ситуациях) одна буква шаблона для числового поля не означает 1 ди git, но столько цифр, сколько нужно. Так что M
не то, что нам нужно здесь. Вместо этого нам нужен DateTimeFormatterBuilder
и его appendValue
метод, который поставляется в нескольких перегруженных версиях. То, что мы используем для разбора полей, между которыми нет разделителей, известно как разбор соседних значений . java .time может делать это, когда все поля, кроме первого, имеют фиксированную ширину, которую вы хорошо выполняете.
Я предпочитаю анализировать в YearMonth
, это идеальное совпадение для информации в ваших строках, но здесь дело не в этом.
Ссылка: Документация DateTimeFormatterBuilder.appendValue(TemporalField, int)
, объясняющая разбор соседних значений.