DateTimeFormatter одиночный ди git месяц - PullRequest
2 голосов
/ 28 января 2020

Я пытаюсь разобрать дату, когда месяц идет от 1 до 12 (а не от 01 до 12).

Я пытаюсь это:

    System.out.println(DateTimeFormatter.ofPattern("[[MM][M]yyyy").parse("112019"));
    System.out.println(DateTimeFormatter.ofPattern("[[MM][M]yyyy").parse("82019"));

первая строка работает, вторая выходит из строя.

Даже Myyyy не удается разобрать вторую строку. Я не смог найти ни одного шаблона, который мог бы анализировать 82019: (

[M] [MM], а также [MM] [M] сбой. При чтении документации написано:

M / L номер месяца / текст 7; 07; июль; июль; J

Таким образом, M должен анализировать как 8, так и 11.

Любой удалось заставить что-то работать?

Это работает: System.out.println(DateTimeFormatter.ofPattern("M-yyyy").parse("8-2019")); Но полученные данные не имеют различий между месяцем и годом.

Ответы [ 3 ]

3 голосов
/ 28 января 2020

Возможно DateTimeFormatterBuilder - это то, что вы ищете:

String s = "112019";
System.out.println(new DateTimeFormatterBuilder()
        .appendPattern("M")
        .appendValue(ChronoField.YEAR, 4)
        .toFormatter()
        .parse(s)
);
3 голосов
/ 29 января 2020
    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), объясняющая разбор соседних значений.

1 голос
/ 28 января 2020

Если все ваши даты указаны в указанном вами формате, рассмотрите возможность выделения значений следующим образом:

String s = "112019";
int yearIndex = s.length() - 4;
String pretty = s.substring(0, yearIndex) + " " + s.substring(yearIndex);
System.out.println(DateTimeFormatter.ofPattern("[M] yyyy").parse(pretty));
...