为了账号安全,请及时绑定邮箱和手机立即绑定

使用 DateTimeFormatter 解析具有模式“dd MMMMM uuuu”的日期

使用 DateTimeFormatter 解析具有模式“dd MMMMM uuuu”的日期

慕哥6287543 2022-07-27 09:54:36
为什么这段代码给我一个例外?String myFormat = "dd MMMMM uuuu";String dateToFormat = "26 Mai 2010";DateTimeFormatter myFormatter = new DateTimeFormatterBuilder().appendPattern(myFormat)            .toFormatter().withResolverStyle(ResolverStyle.STRICT);LocalDate myDate=LocalDate.parse(dateToFormat,myFormatter);例外:java.time.format.DateTimeParseException: Text '26 Mai 2010' could not be parsed at index 4    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)    at java.time.LocalDate.parse(LocalDate.java:400)如果我尝试使用 'MMMM' 而不是 'MMMMM' ,它会按预期工作。String myFormat = "dd MMMM uuuu";
查看完整描述

1 回答

?
米脂

TA贡献1836条经验 获得超3个赞

正如 javadoc ofDateTimeFormatter解释的那样,我引用:正好 4 个模式字母将使用完整的形式。正好 5 个模式字母将使用窄格式。


我也不知道为什么;狭窄的形式实际上非常非常短,大概几个月它会是第一个字母,这是非常没用的,例如 6 月和 7 月都以 J 开头(即使是德语)。弄清楚这种事情的最简单方法是反过来:取一个已知日期并使用.format而不是.parse查看它的样子。


你想要的是 4x 字母 M,这是月份的完整名称。


正如一些评论所说,它的确切运作方式将取决于您的系统区域设置,这使得测试和建议比它需要的要困难得多。通常,您应该始终明确选择语言环境。您可以调用该withLocale方法来强制它。


这是一些示例代码:


import java.time.*; import java.time.format.*; import java.util.*;


public class Test {

    public static void main(String[] args) {

        String myFormatNarrow = "dd MMMMM uuuu";

        String myFormatFull = "dd MMMM uuuu";

        String dateToFormat = "26 Juni 2010";

        String dateToFormat2 = "26 J 2010";

        String dateToFormat3 = "26 Jun 2010";

        DateTimeFormatter myFormatter;

        LocalDate myDate;

        myFormatter = new DateTimeFormatterBuilder().appendPattern(myFormatFull)

                    .toFormatter().withResolverStyle(ResolverStyle.STRICT).withLocale(Locale.GERMAN);

        System.out.println("FULL: " + myFormatter.format(LocalDate.of(2010, 6, 26)));

        myDate = LocalDate.parse(dateToFormat, myFormatter);

        System.out.println("PARSED: " + myDate);

        myFormatter = new DateTimeFormatterBuilder().appendPattern(myFormatNarrow)

                    .toFormatter().withResolverStyle(ResolverStyle.STRICT).withLocale(Locale.GERMAN);

        System.out.println("NARROW: " + myFormatter.format(LocalDate.of(2010, 6, 26)));

        myDate = LocalDate.parse(dateToFormat2, myFormatter);

        // It parses a single J as 'july'. Clearly showing why narrow-form is useless here.

        System.out.println("PARSED: " + myDate);

        // note that even ResolverStyle.LENIENT can't do it either; this will fail:

        myFormatter = myFormatter.withResolverStyle(ResolverStyle.LENIENT);

    //   myDate = LocalDate.parse(dateToFormat3, myFormatter);

    // System.out.println("PARSED: " + myDate);

    }

}


查看完整回答
反对 回复 2022-07-27
  • 1 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号