【问题标题】:JDK7- SimpleDateFormat vs JDK8-DateTimeFormatter, "2019 02" is parsable with the old but not the new oneJDK7- SimpleDateFormat vs JDK8-DateTimeFormatter, "2019 02" 可以用旧解析,但不能用新解析
【发布时间】:2019-03-17 20:15:51
【问题描述】:

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

【问题讨论】:

  • 你有一个我们可以运行的例子,看看我们自己的不同之处吗?详情请见stackoverflow.com/help/mcve
  • @nucandrei,更新了问题。
  • 2018-11 显然与 yyyyMM 不匹配。一个包含破折号,另一个不包含。只需使用正确的模式。
  • 你在比较不同的方法。
  • 如果你可以改变你的代码,为什么你不能改变它使用的模式呢?您的代码依赖于 SimpleDateFormat 的一个有问题的“功能”,并使用了不正确的模式。做正确的事,然后解决它。

标签: java-8


【解决方案1】:

您可以使用 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) 来简单地解析 LocalDate。

【讨论】:

    猜你喜欢
    • 2020-04-24
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2013-10-01
    相关资源
    最近更新 更多