如果我使用类似的模式d/M/yy
用于创建 Java 8 DateTimeFormatter (例如使用DateTimeFormatter.ofPattern(pattern);
(我只会用于解析,而不是格式化),它将所有两个字母的年份解释为 20xx,例如解析一个字符串就像13/5/99
被解释为2099-05-13
,就我而言,这是错误的(本来应该是 1999 年)。
在我的应用程序中,我试图解析 OCR 文档中的日期,例如仍然来自 90 年代,因此将日期解释为当前日期之前 80 年和之后 20 年内的旧 SimpleDateFormat 行为非常适合我。但出于各种原因,我仍然希望将整个日期解析逻辑切换到新的 Java 8 DateTimeFormatters。
查看Java源代码,我发现这都是相对于常量解释的ReducedPrinterParser.BASE_DATE
,但我认为无法更改从模式构建我自己的格式化程序时使用的值。这是根本不可能的还是我错过了指定解析两个字母年份的行为的一些可能性?
您可以创建自定义格式化程序,例如d/M/yy
图案:
new DateTimeFormatterBuilder()
.appendPattern("d/M/")
.appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, LocalDate.now().minusYears(80))
用法示例:
public static void main(String[] args) throws Exception {
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
.appendPattern("d/M/")
.appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, LocalDate.now().minusYears(80))
.toFormatter();
parse("13/5/99", fmt);
parse("13/5/36", fmt);
parse("13/5/35", fmt);
parse("13/5/34", fmt);
parse("13/5/33", fmt);
}
private static void parse(String date, DateTimeFormatter fmt) {
System.out.println(date + " = " + LocalDate.parse(date, fmt));
}
打印:
13/5/99 = 1999-05-13
13/5/36 = 1936-05-13
13/5/35 = 1935-05-13
13/5/34 = 2034-05-13
13/5/33 = 2033-05-13
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)