Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正在处理多个可能未知的日期/时间格式_Java_Validation_Date_Simpledateformat - Fatal编程技术网

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

Java正在处理多个可能未知的日期/时间格式,java,validation,date,simpledateformat,Java,Validation,Date,Simpledateformat,我正在尝试创建一些可以检查多种格式的日期/时间的东西,看看它是否是有效的日期/时间,以便我可以处理它。处理它包括将日期/时间转换为我的软件可以使用的标准化内容。问题是,我必须以不同的方式进行检查,以尝试使用SimpleDateFormat检测日期,但很难获得所有种类。该项目涉及在日期列中解析具有潜在用户指定日期格式的CSV文件。有更好的办法吗?以下是我现在正在做的事情: public static boolean isDateValid(String dateString) { Arra

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

有什么想法或鼓励的话吗?

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

好吧,我的建议如下:

  • 您应该缩小支持的日期格式的类型 creazy支持各种日期格式,例如,一九九零年三月一日 是有效的中文日期格式

  • 我们有一个双重检查方法来检测一个有效的日期 以下:

    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;
    }
    

  • 因为SimpleDataFormat将“2013/4/31”转换为“2013/5/1”,所以4月底是30号,对吗?

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

    你所说的“但我似乎仍然需要循环一系列日期”是什么意思?对不起,我的意思是我必须循环使用可能的输入日期格式。一个很快就会遇到的问题是日期格式的模糊性。即使只是使用普通的西方格式,纯数字形式也可能因具体日期的不同而对月与日产生歧义。这只是一个棘手的问题!如果有任何方法将需求推回到您的数据流中,以选择并坚持日期格式,那么就这样做:-)Hi Ron,同意将事情固定在源位置是理想的,但有时不可行,因为仓库可能有来自各种记录系统的提要,这些系统有自己的理由不执行任何更改。因此,我们必须努力做到最好。
    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;
    }