JDK7 - SimpleDateFormat против JDK8-DateTimeFormatter, «2019 02» можно анализировать со старым, но не новым - PullRequest
0 голосов
/ 17 марта 2019

Я использую один и тот же формат "ггггММ" в SimpleDateFormat и DateTimeFormatter.Я установил снисходительность в обоих форматерах.

Хотя SimpleDateFormat может анализировать «2019 02», но не DateTimeFormatter.Я попытался установить несколько форматеров, но не повезло.

Должно быть, это простой путь, но я не могу себе этого представить.Кто-нибудь знает, как восстановить поведение с DateTimeFormatter?

 String dateString = "2018-11";
  String format = "yyyyMM";

  SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
    simpleDateFormat.setLenient(true);
  try {
    Date parse = simpleDateFormat.parse(dateString);
    System.out.println(parse);
    System.out.println(format + ":parsed: true : java7");

    } catch (ParseException e) {
      System.out.println(format + ":parsed: false : java7");
    }
  DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format).withResolverStyle(ResolverStyle.LENIENT);


  try {
        TemporalAccessor parse = formatter.parse(dateString);
        System.out.println(parse.toString());
        System.out.println(format + ": parsed: true : java11");


    } catch (Exception e) {
        System.out.println(format + ":parsed: false : java11");
        e.printStackTrace();
    }

1 Ответ

0 голосов
/ 18 марта 2019

Вы можете создать DateTimeFormatter со сложным шаблоном с помощью DateTimeFormatterBuilder :

Например, для разбора yyyyMM, yyyy-MM и yyyy MM вы можете использовать:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.YEAR_OF_ERA, 4)
        .optionalStart().appendLiteral('-').optionalEnd()
        .optionalStart().appendLiteral(' ').optionalEnd()
        .appendValue(ChronoField.MONTH_OF_YEAR, 2)
        .toFormatter();

Но этот формат также строг, потому что год и месяц имеют фиксированную ширину, иначе необязательные литералы не работают.

Вы можете добавить .parseDefaulting(ChronoField.DAY_OF_MONTH, 1), чтобы просто проанализировать LocalDate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...