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

Java LocalDate解析中的不一致行为

慕宏博
2023-03-14

我需要解析一个日期,当我解析一个无效的日期“2007年2月29日”时,它将以dd/MM/yyyy的格式返回给我,作为本地日期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呢。作语法分析

共有2个答案

唐泳
2023-03-14

用于测试。

@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”不是闰年。

盖成弘
2023-03-14

您需要更改解析器样式:

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

注意,使用uuuu而不是yyyy来指定年份,而不是年代。(我确信有某种方法可以让yyyy工作起来,并设想一个广告时代,但我不确定如何立即实现。)

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

 类似资料:
  • 在我刚刚编写的一个测试解析器中,我遇到了一个奇怪的问题,我不太明白。 将其简化为显示问题的最小示例,让我们从以下语法开始: 这是语法的变化: 突然间,相同的测试输入被错误地分解成两个statement_list,每个statement_list都继续到一个带有“missing”;“警告,第一个返回“z=”的不完整的assignment_statement,第二个返回“x+”的不完整的assignm

  • 我正在尝试读取特定格式的日期字符串。 首先,让我们以所需格式生成当前时间的字符串。 现在,让我们尝试将其转换回datetime对象。 错误与格式有关,格式完全相同。 这是怎么回事?

  • 问题内容: 我真的很head头。我使用s已有一段时间了,但现在,使用SimpleDateFormat解析日期(只是有时)是完全错误的。 特别: 打印字符串。有没有搞错?-它甚至都不会一直解析为错误的日期! 更新: 修复得很漂亮。您不知道吗,在其他一些地方也滥用了它。一定喜欢调试别人的代码:) 问题答案: 我认为您要使用格式,而不是’hh’,以便您使用00-23之间的小时数。“ hh”采用12小时增

  • 我编写了下面的代码来弄清楚onTextChanged()方法是如何工作的: 我注意到:当我只打字时,计数非常简单: 现在,如果我添加3个(或更多)数字,然后继续键入字母,就会发生以下情况: 对我来说,输入3位数字似乎会以某种方式改变TextWatcher的行为,使其将之后的所有内容视为Char而不是CharSequence。 对这种行为有什么解释吗?

  • 问题内容: 我正在使用JSON,它返回三种不同的对象类型“项目”,“类别”和“修饰符”。可以在此处查看JSON的示例。我为三种类型的对象创建了模型。但是当我解组时,我选择了一种类型来解组整个JSON。(我知道这不可能是正确的方法…)然后,我尝试根据不同的类型来解析不同的项目,如json字段“类型”,然后将该对象附加到适当类型的切片中。我遇到错误,因为我不知道如何解组其中具有不同字段且具有不同类型的