小编Ive*_*eva的帖子

具有指定parseDefaulting的DateTimeFormatterBuilder与YEAR字段冲突

我有以下格式化程序:

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());
Run Code Online (Sandbox Code Playgroud)

我试着解析字符串"201505"

System.out.println(ZonedDateTime.parse("201505", formatter));
Run Code Online (Sandbox Code Playgroud)

它会引发异常:

引起:java.time.DateTimeException:发现冲突:2016年与2015年不同

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

据我所知,如果没有解析值,它应该只尝试替换默认值.这似乎适用于月份,因为我的月份与解析的默认月份不同.但它不适用于一年.

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

java datetime java-8 java-time

10
推荐指数
1
解决办法
1674
查看次数

由appendValue方法定义的Java8 appendPattern vs pattern产生不同的结果

我的代码中有"ddMMyy"模式,我使用appendValue方法指定了它:

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
                    .appendValue(ChronoField.DAY_OF_MONTH, 2)
                    .appendValue(ChronoField.MONTH_OF_YEAR, 2)
                    .appendValue(ChronoField.YEAR_OF_ERA, 2)
                    .toFormatter();
System.out.println(LocalDate.parse("100199", dateTimeFormatter));
Run Code Online (Sandbox Code Playgroud)

但是这会产生"0099"年份:

0099-01-10

如果我将其更改为使用appendPattern:

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
                    .appendPattern("ddMMyy")
                    .toFormatter();
System.out.println(LocalDate.parse("100199", dateTimeFormatter));
Run Code Online (Sandbox Code Playgroud)

我有正确的结果,一年"2099"与世纪.

2099年1月10日

代码对我来说似乎相同,为什么它不能产生相同的结果?为什么在第一种情况下缺少这个世纪?

java datetime java-8 java-time

7
推荐指数
1
解决办法
146
查看次数

标签 统计

datetime ×2

java ×2

java-8 ×2

java-time ×2