当前位置: 首页 > 知识库问答 >
问题:

如何更改使用Java 8 DateTimeFormatter解析两年的基准日期?

商辰钊
2023-03-14

如果我使用像d/M/yy这样的模式来创建Java 8 DateTimeFormatter(例如,使用DateTimeFormatter.of模式(模式)(我将只用于解析,而不是格式化),它将把所有两个字母的年份解释为20xx,例如解析一个字符串,如13/5/99,将其解释为2099-05-13,这在我的情况下是错误的(应该是在1999年)。

在我的应用html" target="_blank">程序中,我试图解析OCR文档中的日期,例如,可能仍然是90年代的日期,因此,将日期解释为当前日期之前80年和之后20年的旧SimpleDateFormat行为非常适合我。但出于各种原因,我仍然希望将整个日期解析逻辑切换到新的Java 8 DateTimeFormatters。

通过查看Java源代码,我看到这都是相对于常量ReduedPrinterParser.BASE_DATE来解释的,但是我看不到从模式构建自己的格式化程序时使用的值有什么方法。这是根本不可能的,还是我错过了指定解析两个字母年份的行为的一些可能性?

共有1个答案

百里鸿祯
2023-03-14

您可以为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字符串,以便是有效日期,而不是。假设这些是正常公历的广告日期。 我试图使用JDK8中新的包来解决这个问题,但事实证明它比希望的要复杂。我当前的代码是: 如何使用来解决我的简单用例?

  • 问题内容: 有人可以向我展示一段解析此日期的Java代码: 2009-08-05 进入此GMT日期: 2009/217:00:00 ==== 到目前为止,我有: 但它不起作用 问题答案: 这是您要寻找的格式:

  • 问题内容: 用户将以不同的模式向我的应用程序输入日期。对于两位数的年份,他还必须确定关键日期。 示例: pattern = yy-MM-dd 枢轴日期= 70 (我以编程方式添加了当前的千年和上个世纪,以获得更多动态=> 1970 ) 69-04-22 变为 2069-04-22 70-04-22 变为 1970-04-22 像此答案中所述,很容易在已知日期模式(此处为 ddMMyy )时构建一个

  • 如果我传递了一个日期和时间字符串,一切都按预期进行: 如何将这样的日期解析为LocalDateTime(使用默认时间)?

  • 我使用下面的代码计算两个日期之间的年、月和天的数目,使用 以上代码的预期输出是(使用此站点并使用google play store中的一个应用程序进行勾选) null 如果需要更多的信息请告诉我。提前道谢。你的努力将会受到赞赏。

  • 我正在处理卡的到期日期。我有一个API,我将在其中获得“yyMM”格式的到期日期为“String”。在这里,我正在尝试使用 带有TimeZone.getTimeZone("UTC ")的SimpleDateFormat 所以我的代码就像 现在的问题是,当我通过 2011 年时,它给出的是 这里你可以看到我把11作为月份,但是它把它转换成10月而不是11月。 为什么? 还有哪些其他选项可以将带有 的