JDK7 - SimpleDateFormat vs JDK8-DateTimeFormatter,"2019 02"可以解析旧的,但不能解析新的



我在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();
    }

您可以使用DateTimeFormatterBuilder创建具有复杂模式的DateTimeFormatter:

例如,要解析yyyyMMyyyy-MMyyyy 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)简单地解析局部日期。

相关内容

最新更新