JDK7- SimpleDateFormat与JDK8-DateTimeFormatter,“ 2019 02”可与旧版本进行解析,而不是新版本

时间:2019-03-17 20:15:52

标签: java-8

我在SimpleDateFormat和DateTimeFormatter中使用相同的格式“ yyyyMM”。我在两个格式化程序中都设置了宽大处理。

尽管,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 :(得分:0)

您可以创建带有DateTimeFormatterBuilder的复杂模式的DateTimeFormatter:

例如,要解析MyDatayyyyMMyyyy-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(); 来简单地解析LocalDate。