首页 > 解决方案 > 如何使用 DateTimeFormatter 解析“Feb 25”和“February 25”?

问题描述

我使用以下代码:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MMM dd");
LocalDate date = LocalDate.parse(s, formatter);

解析日期字符串,例如“2019 Feb 25”。但我也希望这段代码解析这样的字符串:“2019 年 2 月 25 日”。我可以以某种方式更改格式字符串“yyyy MMM dd”来实现这一点吗?

我尝试了以下格式字符串“yyyy MMMM dd”、“yyyy MMM[M] dd”、“yyyy [M+] dd”,但我无法同时解析“2019 年 2 月 25 日”和“2019 年 2 月 25 日”。

标签: java

解决方案


以下基于建议答案的代码片段证明可以使用一个解析器解析不同格式的日期。

但是,不应将此类解析器用于输出,因为它使用多种格式进行打印。

    // using several formats in parser
    DateTimeFormatter parser = DateTimeFormatter.ofPattern(
        "[yyyy [MMMM][MMM] dd][yyyy-MM-dd][MM/dd/yyyy]");

    // prepare single format for output
    DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd");


    LocalDate d1 = LocalDate.parse ("2019 Feb 31", parser); // parsed correctly to the last Feb day
    LocalDate d2 = LocalDate.parse ("2019 February 26", parser);
    LocalDate d3 = LocalDate.parse ("2019-02-27", parser);
    LocalDate d4 = LocalDate.parse("02/30/2020", parser); // parsed to the last Feb date in a leap year

    System.out.println (d1.format (parser));
      
    System.out.println (d1.format (format));
    System.out.println (d2.format (format));
    System.out.println (d3.format (format));
    System.out.println (d4.format (format));

输出

2019 FebruaryFeb 282019-02-2802/28/2019                                                                                                        
2019-02-28                                                                                                                                             
2019-02-26                                                                                                                                             
2019-02-27                                                                                                                                             
2020-02-29 

parser输出的第一行被格式弄乱了。

GDB 在线演示


推荐阅读