0

我正在尝试创建可以检查多种格式的日期/时间的东西,以查看它是否是有效的日期/时间,以便我可以处理它。处理它包括将日期/时间转换为标准化的东西,以便我的软件可以使用。问题是我必须以不同的方式进行检查,以尝试使用 SimpleDateFormat 检测日期,但确实很难获得每个品种。该项目与在日期列中解析具有潜在用户指定日期格式的 CSV 文件有关。有没有更好的办法?这是我现在正在做的事情:

public static boolean isDateValid(String dateString)
{
    ArrayList<SimpleDateFormat> dateFormats = new ArrayList<SimpleDateFormat>();

    dateFormats.add(new SimpleDateFormat("M/dd/yyyy"));
    dateFormats.add(new SimpleDateFormat("dd.M.yyyy"));
    dateFormats.add(new SimpleDateFormat("M/dd/yyyy hh:mm:ss"));
    dateFormats.add(new SimpleDateFormat("dd.M.yyyy hh:mm:ss"));
    dateFormats.add(new SimpleDateFormat("dd-M-yyyy hh:mm:ss"));
    dateFormats.add(new SimpleDateFormat("M-dd-yyyy hh:mm:ss"));
    dateFormats.add(new SimpleDateFormat("yyyy-M-dd hh:mm:ss"));
    dateFormats.add(new SimpleDateFormat("dd.MMM.yyyy"));
    dateFormats.add(new SimpleDateFormat("dd-MMM-yyyy"));
    dateFormats.add(new SimpleDateFormat("M/dd"));
    dateFormats.add(new SimpleDateFormat("M dd"));
    dateFormats.add(new SimpleDateFormat("M y"));
    for (SimpleDateFormat format : dateFormats) 
    {
        try 
        {
            format.setLenient(false);
            Date date = format.parse(dateString);
            return true;
        } 
        catch (Exception e) 
        {

        }
    }
    return false;
}

此外,我还尝试使用 apache commons 中的 DateUtils,但似乎我仍然需要循环浏览一堆日期。

public static boolean isDate(String dateString)
{
    try
    {
        Date theDate = DateUtils.parseDate(dateString);
    }
    catch (Exception e)
    {
        System.out.println(e);
        return false;
    }
    return true;
}

有什么想法或鼓励的话?

4

3 回答 3

0

好吧,这是我的建议:

  1. 您应该缩小支持的日期格式类型。支持每种日期格式是很疯狂的,例如,一九九零年三月一日是中文有效的日期格式。

  2. 我们有一种双重检查方法来检测有效日期,如下所示:

    public boolean isDate(String dateStr, DateFormat format){
        boolean result = false;
        try
        {
            Date date = format.parse(dateStr);
            if (format.format(date).equals(dateStr))
            {
                result = true;
            }
        } catch (Exception e)
        {
            result = false;
        }
        return result;
    }
    

因为 '2013/4/31' 被 SimpleDateFormat 翻译成 '2013/5/1',所以 4 月的最后一天是 30 日,对吗?

于 2013-04-20T02:22:48.037 回答
0

我在工作中被分配了一个类似的问题,我参与了一个 ETL 过程,将数据从源文件加载到仓库。日期格式因来源提供者而异。我的解决方案与列出的循环示例一起使用。有一个选项可以使用parsePosition而不是循环。但是,有一些方法可以使循环代码更好,而不是再次实例化 SimpleDateFormat(已经发布)。相反,只需使用applyPattern. 此外,将各种格式保存在一个平面文件 (config) 中可以更好地配置和适应新格式。我已在以下链接中发布了我的实现。它可能会有所帮助。

于 2013-07-08T03:44:16.073 回答
0

您当前方法的一个问题是,当您知道您只会使用一个时,您不必要地创建所有这些 SimpleDateFormat 实例。相反,使用正则表达式来检测您收到的日期字符串类型,然后执行以下两项操作之一:1) 仅实例化您需要的格式化程序,或 2) 将字符串操作为您可以解析的标准格式通用格式化程序。

于 2013-04-20T01:33:38.357 回答