java - DateTimeFormatterBuilder 与 YEAR 字段的指定 parseDefaulting 冲突

标签 java datetime java-8 java-time

我有以下格式化程序:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("yyyyMM")
        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
        .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
        .parseDefaulting(ChronoField.YEAR, ZonedDateTime.now().getYear())
        .toFormatter()
        .withZone(ZoneId.systemDefault());

我尝试解析字符串“201505”

System.out.println(ZonedDateTime.parse("201505", formatter));

它抛出一个异常:

Caused by: java.time.DateTimeException: Conflict found: Year 2016 differs from Year 2015

如果我注释掉 YEAR 的默认值设置,它会起作用。

据我对文档的理解,如果没有解析值,它应该只尝试替换默认值。似乎这适用于一个月,因为我的月份与解析的默认月份不同。但是,它不适用于一年。

我是不是用错了,有人能告诉我是否有不同的方法来为模式中可能不存在的字段定义默认值吗?

最佳答案

问题是模式字母“y”指的是ChronoField.YEAR_OF_ERA,而不是ChronoField.YEAR。只需更改最后的 parseDefaulting 行:

.parseDefaulting(ChronoField.YEAR_OF_ERA, ZonedDateTime.now().getYear())

它应该可以工作。

关于java - DateTimeFormatterBuilder 与 YEAR 字段的指定 parseDefaulting 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38307816/

相关文章:

java - 在同一台 PC 上运行两个针对不同 JRE 的 Java Web 应用程序

java - 如何使用 Java 在 MongoDB 3 中使用多个过滤器执行文档的批量更新

CakePHP 表单助手 minYear

r - 将数字(integer64 类)UNIX 时间戳转换为日期时间类

java - 如何使用 JAVA 8 从 map 中获取第一个键值?

java - 如何加载eclipse插件

java - 在实体中使用嵌入式类时传递的分离实体保持不变

C# 日期时间格式

Java 使用 lambda 谓词查找列表中元素的索引

java - 如何编写 Stream.findNth() 代码?