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



我的代码中有模式"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));

但是,这将生成年份的"0099":

0099-01-10

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

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

我有带有世纪的"2099"年的正确结果。

2099年01月10日

代码对我来说似乎是等效的,为什么它没有产生相同的结果?为什么在第一种情况下缺少世纪?

因为appendValue在没有进一步操作的情况下通过年份 - 在您的情况下为 99。

如果要从"基准年"(例如 2000 年)开始,并将该值添加到该基准年(以获得 2099 年),则可以改用appendValueReduced

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
        .appendValue(ChronoField.DAY_OF_MONTH, 2)
        .appendValue(ChronoField.MONTH_OF_YEAR, 2)
        .appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, LocalDate.of(2000, 1, 1))
        .toFormatter();

当您使用 yy 模式时,默认情况下会获得该行为,如 javadoc 中所述:

年份:字母计数确定使用填充的最小字段宽度。如果字母计数为 2,则使用简化的两位数形式。对于打印,这将输出最右边的两位数字。对于解析,这将使用基值 2000 进行分析,从而在 2000 到 2099 (含)范围内生成一年。[...]

相关内容

  • 没有找到相关文章

最新更新