我的代码中有模式"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 (含)范围内生成一年。[...]