我在代码中使用了appenddd方法指定了“ddMMyy”模式:

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模式时,默认情况下会获得该行为,如the javadoc中所述:

:字母的数目确定了最小字段宽度,在该最小字段宽度以下使用填充。如果字母数为2,则使用简化的两位数形式。对于打印,这将输出最右边的两位数字。对于解析,这将使用2000的基值进行解析,从而得出2000到2099(含)之间的一年。 [...]

07-24 22:15