gpt4 book ai didi

java - 如何使用 Java 8 DateTimeFormatter 更改解析两个字母年份的基准日期?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:48 26 4
gpt4 key购买 nike

如果我使用像 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

关于java - 如何使用 Java 8 DateTimeFormatter 更改解析两个字母年份的基准日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32505490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com