有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

验证Java处理多个可能未知的日期/时间格式

我正在尝试创建一些东西,可以检查多种格式的日期/时间,看看它是否是有效的日期/时间,以便我可以处理它。处理它包括将日期/时间转换为我的软件可以使用的标准化内容。问题是,我必须以不同的方式进行检查,以尝试使用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;
}

有什么想法或鼓励的话吗


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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