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

Java 8 DateTimeFormatter两位数年18解析为0018而不是2018?

沈单弓
2023-03-14

使用Java8,下面的代码将“18”解析为年份“0018”,而不是“2018”。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/y");
return LocalDate.parse(date, formatter);

“m/d/yy”抛出4位数年份的异常,并将“01/05/97”解析为“2097-01-05”。理想情况下,应该将其解析为“1997-01-05”。

“m/d/yyyy”抛出异常2位数年。

共有1个答案

拓拔烨赫
2023-03-14

没有一个yu字符串允许您同时解析两位数和四位数年份。但是,您可以在格式模式字符串中使用可选部分来指定可能存在的两位或四位数字年份:

public static LocalDate parseDateString(CharSequence date) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/[uuuu][uu]");
    return LocalDate.parse(date, formatter);
}

试试看:

    System.out.println(parseDateString("01/05/18"));
    System.out.println(parseDateString("01/06/2018"));

这张印有:

2018-01-05
2018-01-06
    DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("M/d/")
            .optionalStart()
            .appendPattern("uuuu")
            .optionalEnd()
            .optionalStart()
            .appendValueReduced(ChronoField.YEAR, 2, 2, 1920)
            .optionalEnd()
            .toFormatter();
    System.out.println(parseDateString("01/05/22"));

这将打印:

1922-01-05

以1920年为基数(如我的示例代码中所示)将导致从1920年到2019年的间隔中出现两位数年。根据您的要求调整该值。

 类似资料:
  • Java.time框架内置在Java8和更高版本中,它将两位数的年份字符串解析为2000年代。所以变成。 来自类文档: 是的,我知道,使用两位数的年值是愚蠢的。但数据不在我的控制之下。

  • Excel单元格的日期格式为,显示日期为4位年份。然而,POI以另一种格式返回日期。单元格样式返回相同的格式,带有2位year。 有没有可能用POI获得与我在Excel中看到的格式相同的格式?

  • 我有一个简单的问题:我希望严格地以的格式解析Java字符串,以便是有效日期,而不是。假设这些是正常公历的广告日期。 我试图使用JDK8中新的包来解决这个问题,但事实证明它比希望的要复杂。我当前的代码是: 如何使用来解决我的简单用例?

  • 问题内容: 他们在Play Framework的首页上声称“ JSON是头等公民”。我还没有看到证明。 在我的项目中,我正在处理一些非常复杂的JSON结构。这只是一个非常简单的示例: 现在,我知道Play正在使用Jackson解析JSON。我在Java项目中使用Jackson,并且会做如下简单的事情: 这将很好地将我的JSON解析为我想要的Map对象-字符串和对象对Map,并允许我轻松地将数组转换

  • 问题内容: 首先让我解释一下这个问题。 我的Golang应用程序中包含了JSON记录流。它基本上将这些转发到数据存储(InfluxDB)。JSON中有一些整数值,还有一些浮点值。必须将它们与原始数据类型一起转发到数据存储。否则,将发生类型冲突,并且写入操作将失败。 Ruby JSON解析器可以轻松做到这一点: Golang中的软件包确实有一些麻烦(所有数字都解析为浮点数): 哪些打印: 我需要一种

  • 我正在尝试将一些大小数格式化为货币格式。我不需要小数点来显示是否在大小数点中没有,但两个小数点来显示是否有(即使只有10s) 例如。 12334->12,334