Dav*_*vid 10 java parsing date 2-digit-year java-time
如果我使用类似于d/M/yy创建Java 8 DateTimeFormatter的模式(例如使用DateTimeFormatter.ofPattern(pattern);(我将仅用于解析,而不是格式化),它将所有两个字母的年份解释为20xx,例如解析一个字符串,如同13/5/99被解释为2099-05-13,在我的情况下是错误的(它应该是在1999年).
在我的应用程序中,我试图解析OCR'd文档中的日期,例如仍然可以从90年代开始,所以使用旧的SimpleDateFormat行为将日期解释为在当前日期之前和之后的20年之内我很好.但由于各种原因,我仍然希望将整个日期解析逻辑切换到新的Java 8 DateTimeFormatters.
通过Java源代码,我看到这都是相对于常量解释的ReducedPrinterParser.BASE_DATE,但我认为无法更改从模式构建自己的格式化程序时使用的值.这是不可能的,还是我错过了指定解析两个字母年份的行为的可能性?
ass*_*ias 12
您可以创建自定义格式化程序,例如d/M/yy:
new DateTimeFormatterBuilder()
.appendPattern("d/M/")
.appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, LocalDate.now().minusYears(80))
Run Code Online (Sandbox Code Playgroud)
用法示例:
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));
}
Run Code Online (Sandbox Code Playgroud)
打印:
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年5月13日