[英]Inconsistent Behaviour in Java LocalDate parse
当我解析无效日期“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 格式(不带 DateTimeFormatter)进行解析,则会出现异常,代码如下:
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
(没有格式化程序)被记录为使用DateTimeFormatter.ISO_LOCAL_DATE
,它使用 STRICT 解析器 - 所以这里并没有真正的不一致。
将其用于测试。
@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”不是闰年。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.