Java 带有嵌套选项的DateTimeFormatter

Java 带有嵌套选项的DateTimeFormatter,java,Java,我有三种类型的ISO日期:yyyy,yyy-MM,yyy-MM-dd。换句话说,从一年到一个月到一天越来越精确。如果缺少字段,则应将其映射到可能的最低值(缺少的日期->月的第一天//缺少的月份->年的第一个月) 一天不能没有一个月,所以我认为使用嵌套括号可以很好地工作: DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy[-MM[-dd]]"); LocalDate ld = LocalDate.pa

我有三种类型的ISO日期:
yyyy
yyy-MM
yyy-MM-dd
。换句话说,从一年到一个月到一天越来越精确。如果缺少字段,则应将其映射到可能的最低值(缺少的日期->月的第一天//缺少的月份->年的第一个月)

一天不能没有一个月,所以我认为使用嵌套括号可以很好地工作:

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy[-MM[-dd]]");
        LocalDate ld = LocalDate.parse("2019-08-10", dtf); // ok
        ld = LocalDate.parse("2019-08", dtf); // error
        ld = LocalDate.parse("2019", dtf); // error
但是,遗憾的是,两个最底层的人吐出了一个DateTimeParseException。这可能吗

编辑:明白了。事实证明,正如注释中提到的,默认值并不是隐式设置的。这就解决了这个问题:

        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                .append(DateTimeFormatter.ofPattern("yyyy[-MM[-dd]]"))
                .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
                .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
                .toFormatter();

该模式无效,它不是正则表达式,无法处理这样的缺失值。那么什么可以处理这样的缺失值呢?有可能吗?这个错误应该给你一个提示。一个
LocalDate
由所有三部分组成。输出应该由所有三部分组成。2019-08应解析为2019-08-01。是否回答了您的问题?