如何在Java中根据多个模式格式验证日期?

如何在Java中根据多个模式格式验证日期?,java,simpledateformat,Java,Simpledateformat,我的问题不是“怎么做”,我的问题是涉及的角落案件。这是我的代码和测试用例 package datetest.com; import java.text.ParseException; import java.text.SimpleDateFormat; public class MultipleDateParserFormat { private final static String[] PossibleDateFormat=new String[]{ "MM/dd

我的问题不是“怎么做”,我的问题是涉及的角落案件。这是我的代码和测试用例

package datetest.com;

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class MultipleDateParserFormat {
    private final static String[] PossibleDateFormat=new String[]{
        "MM/dd/yyyy",
        "MM.dd.yyyy",
        "MM-dd-yyyy",
        "yyyy/MM/dd",
        "yyyy.MM.dd",
        "yyyy-MM-dd",
        "dd/MM/yyyy",
        "dd.MM.yyyy",
        "dd-MM-yyyy"
        };

    public MultipleDateParserFormat(){};
    public void checkParseDate(String passedDate){
        int PossibleDateFormatLength=PossibleDateFormat.length;

        for(int i=0;i<PossibleDateFormatLength;i++){
            try {
                SimpleDateFormat simpleDateFormant=new SimpleDateFormat(PossibleDateFormat[i]);
                simpleDateFormant.setLenient(false);
                java.util.Date date= simpleDateFormant.parse(passedDate);
                System.out.println(date);

            } catch (ParseException e) {

                System.out.println("Parse Exception Occured for your input Value"+passedDate + "for format" + PossibleDateFormat[i]);
            }
        }


    }

    public static void main(String...strings){

        String passedDate="4-03-1992";// This test case is validating against two Pattern 

        MultipleDateParserFormat multipleDateParserFormat= new MultipleDateParserFormat();
        multipleDateParserFormat.checkParseDate(passedDate);
    }

}
因为我的测试用例满足两个给定的模式,所以我得到两个输出


我怎样才能避免这种情况?还有什么其他方法可以进行这种多模式验证?

模式MM dd yyyy和dd MM yyyy都适用于1992年3月4日。这就是为什么你会得到两个通过的结果。如果您希望测试只允许一次通过,则将一个字段设置为>12

至于另一种方法——有许多不同的方法。就个人而言,我不想依赖抛出异常。查看Java中的正则表达式API:


你可以从那里找到答案。

模式MM-dd-yyyy和dd-MM-yyyy都适用于1992年3月4日。这就是为什么你会得到两个通过的结果。如果您希望测试只允许一次通过,则将一个字段设置为>12

至于另一种方法——有许多不同的方法。就个人而言,我不想依赖抛出异常。查看Java中的正则表达式API:


你可以从那里找到答案。

我认为唯一可靠的方法是提前知道日期格式。你永远不可能知道2014年1月1日是dd/MM/yyyy还是MM/dd/yyyy

我认为唯一可靠的方法是提前知道日期格式。您永远无法知道2014年1月1日是dd/MM/yyyy还是MM/dd/yyyy

似乎您需要某种简单的分类器:

  • 拿一大套培训教材
  • 处理它们,计算并记住每个模式的频率
  • 然后,如果发现多个匹配项,则选择一个频率更高的模式


    它不会给出100%的准确度,但会显著提高它。从您将使用的语言/地区附近的来源获取培训数据非常重要。例如,在俄罗斯,我们从不使用
    mm/dd/yyyy
    mm.dd.yy
    ,但对我们来说,这是一种非常常见的格式。

    似乎您需要某种简单的分类器:

  • 拿一大套培训教材
  • 处理它们,计算并记住每个模式的频率
  • 然后,如果发现多个匹配项,则选择一个频率更高的模式


    它不会给出100%的准确度,但会显著提高它。从您将使用的语言/地区附近的来源获取培训数据非常重要。例如,在俄罗斯,我们从不使用
    mm/dd/yyyy
    mm.dd.yy
    ,但对我们来说,这是一种非常常见的格式。

    这样做没有好的方法,因为1992年3月4日和1992年4月4日都是有效日期,像您这样的库方法无法确定哪一个是正确的。您可以使用
    java.util.Locale
    获取区域并围绕该区域中接受的日期格式构建代码,但这仍然不是万无一失的,也不会防止用户错误,例如一名英国侨民使用诸如
    “MM/dd/yyyyy”和
    “dd/MM/yyyy”等格式键入其本地格式
    可能看起来是一样的。对于像2015年11月12日这样的输入,您无法确定格式。您的代码似乎工作正常,只需检查一些模式是否匹配,然后退出,如果不匹配,不要抛出异常。。。。注意:如果您不知道您的日期模式04-03-1992可以是03年4月5日或03年3月4日星期三,那么没有好的方法可以做到这一点,因为04-03-1992和03-04-1992都是有效日期,像您这样的库方法将无法确定哪一个是正确的。您可以使用
    java.util.Locale
    获取区域并围绕该区域中接受的日期格式构建代码,但这仍然不是万无一失的,也不会防止用户错误,例如一名英国侨民使用诸如
    “MM/dd/yyyyy”和
    “dd/MM/yyyy”等格式键入其本地格式
    可能看起来是一样的。对于像2015年11月12日这样的输入,您无法确定格式。您的代码似乎工作正常,只需检查一些模式是否匹配,然后退出,如果不匹配,不要抛出异常。。。。注意:如果您不知道您的日期模式04-03-1992可以是03年4月5日或04年3月3日星期三如果发生多个匹配,“分类器”只会给出用户实际意思的“最佳猜测”。猜测可能是错的,你永远不会知道。。。除非你问用户。如果出现多个匹配,那么“分类器”只会给出用户实际意思的“最佳猜测”。猜测可能是错的,你永远不会知道。。。除非你问用户。
    Parse Exception Occured for your input Value4-03-1992for formatMM/dd/yyyy
    Parse Exception Occured for your input Value4-03-1992for formatMM.dd.yyyy
    Fri Apr 03 00:00:00 IST 1992
    Parse Exception Occured for your input Value4-03-1992for formatyyyy/MM/dd
    Parse Exception Occured for your input Value4-03-1992for formatyyyy.MM.dd
    Parse Exception Occured for your input Value4-03-1992for formatyyyy-MM-dd
    Parse Exception Occured for your input Value4-03-1992for formatdd/MM/yyyy
    Parse Exception Occured for your input Value4-03-1992for formatdd.MM.yyyy
    Wed Mar 04 00:00:00 IST 1992