一尘不染

Java如何使用SimpleDateFormat解析多种格式的日期

java

我正在尝试解析文档中的某些日期。看来用户已经以类似但并非确切的格式输入了这些日期。

格式如下:

9/09
9/2009
09/2009
9/1/2009
9-1-2009 

尝试解析所有这些的最佳方法是什么?这些似乎是最常见的,但是我想让我感到困扰的是,如果我的模式“ M / yyyy”永远不会在“ MM / yyyy”之前出现,我是否必须设置try / catch块以最小限制嵌套到最大限制方式?看来肯定会花费很多代码重复才能实现此目的。


阅读 1131

收藏
2020-03-02

共1个答案

一尘不染

你需要SimpleDateFormat为每个不同的模式使用不同的对象。也就是说,由于以下原因,你不需要那么多不同的对象:

数字:对于格式设置,图案字母的数量是最小位数,较短的数字用零填充此数量。对于解析,除非需要将两个相邻字段分开,否则将忽略模式字母的数量。

因此,你将需要以下格式:

  • "M/y"(即盖9/099/201909/2019
  • "M/d/y"(涵盖9/1/2019
  • "M-d-y"(涵盖9-1-2019

因此,我的建议是编写一种工作方式如下(未测试)的方法:

// ...
List<String> formatStrings = Arrays.asList("M/y", "M/d/y", "M-d-y");
// ...

Date tryParse(String dateString)
{
    for (String formatString : formatStrings)
    {
        try
        {
            return new SimpleDateFormat(formatString).parse(dateString);
        }
        catch (ParseException e) {}
    }

    return null;
}
2020-03-02