Java LocalDate 解析中的不一致行为

  • 本文关键字:不一致 LocalDate Java java
  • 更新时间 :
  • 英文 :


当我解析无效日期"29/02/2007"时,我需要解析一个格式为 dd/MM/yyyy 的日期,它作为 LocalDate 2007-02-28 返回给我,代码如下:

LocalDate birthD = null;

try {
birthD = LocalDate.parse("29/02/2007", DateTimeFormatter.ofPattern("dd/MM/yyyy"));
} catch (DateTimeParseException e) {
e.printStackTrace();
}

System.out.println("birthDStr: " + birthDStr);
System.out.println("parsed birthD: " + birthD);

但是,如果我使用 ISO 格式(没有日期时间格式化程序)解析,那么它会给出异常,代码如下:

final String birthDStr = "2007-02-29";
LocalDate birthD = null;

try {
birthD = LocalDate.parse(birthDStr);
} catch (DateTimeParseException e) {
e.printStackTrace();
}

System.out.println("birthDStr: " + birthDStr);
System.out.println("parsed birthD: " + birthD);

例外:

java.time.format.DateTimeParseException: Text '2007-02-29' could not be parsed: Invalid date 'February 29' as '2007' is not a leap year
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
at java.time.LocalDate.parse(LocalDate.java:400)
at java.time.LocalDate.parse(LocalDate.java:385)
at com.cchaidoris.quick_test.DateTest.parseTest2(DateTest.java:65)
at com.cchaidoris.quick_test.DateTest.main(DateTest.java:41)
Caused by: java.time.DateTimeException: Invalid date 'February 29' as '2007' is not a leap year
at java.time.LocalDate.create(LocalDate.java:429)
at java.time.LocalDate.of(LocalDate.java:269)
at java.time.chrono.IsoChronology.resolveYMD(IsoChronology.java:560)
at java.time.chrono.IsoChronology.resolveYMD(IsoChronology.java:123)
at java.time.chrono.AbstractChronology.resolveDate(AbstractChronology.java:472)
at java.time.chrono.IsoChronology.resolveDate(IsoChronology.java:492)
at java.time.chrono.IsoChronology.resolveDate(IsoChronology.java:123)
at java.time.format.Parsed.resolveDateFields(Parsed.java:351)
at java.time.format.Parsed.resolveFields(Parsed.java:257)
at java.time.format.Parsed.resolve(Parsed.java:244)
at java.time.format.DateTimeParseContext.toResolved(DateTimeParseContext.java:331)
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1955)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)

所以我的问题是,我想考虑这一点:

LocalDate.parse("29/02/2007", DateTimeFormatter.ofPattern("dd/MM/yyyy"));

无效,我该如何使用 LocalDate.parse?

您需要更改解析器样式

DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("dd/MM/uuuu")
.withResolverStyle(ResolverStyle.STRICT);
LocalDate.parse("29/02/2007", formatter); // Throws

请注意,使用uuuu而不是yyyy来指定年份而不是纪元年份。(我确信有某种方法可以让yyyy工作并假设一个 AD 时代,但我不确定如何随便。

请注意,LocalDate.parse(没有格式化程序)被记录为使用使用 STRICT 解析器的DateTimeFormatter.ISO_LOCAL_DATE- 因此这里并没有真正的不一致。

将其用于测试。

@Test
void test() {
final String birthDStr = "2007-02-27";
LocalDate birthD = null;
try {
birthD = LocalDate.parse(birthDStr);
} catch (DateTimeParseException e) {
e.printStackTrace();
}
}

@Test
void test() {
final String birthDStr = "29/02/2007";
LocalDate birthD = null;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy");
try {
birthD = LocalDate.parse(birthDStr, formatter);
} catch (DateTimeParseException e) {
e.printStackTrace();
}
}

您的代码正确,而不是正确的日期。无法分析文本"2007-02-29":日期"2 月 29 日"无效,因为"2007"不是闰年。

最新更新