如何根据Java中的多种模式格式验证日期?

时间:2015-04-20 14:51:28

标签: 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/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);
    }

}

这是我在运行此代码时获得的OUTPUT:

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

由于我的测试用例满足两个给定的模式,我得到两个输出。

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

3 个答案:

答案 0 :(得分:3)

我认为唯一可靠的方法是事先知道日期格式。你永远不知道01/01/2014是dd / MM / yyyy还是MM / dd / yyyy

答案 1 :(得分:1)

模式MM-dd-yyyy和dd-MM-yyyy均适用于4-03-1992。这就是为什么你得到2个结果通过。如果你想测试只允许一个,然后将一个字段设置为&gt; 12.

至于另一种方式 - 有许多不同的方式。就个人而言,我不想依赖被抛出的异常。查看Java中的Regex API:

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

你可以从那里弄清楚。

答案 2 :(得分:0)

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

  1. 采取大量培训文本。
  2. 处理它们,计算并记住每种模式的频率。
  3. 然后,如果找到多个匹配项,请选择频率更高的模式之一。

    它不会给出100%的准确度,但会显着改善它。从接近您将使用的来源和相同语言/区域获取培训数据非常重要。例如,在俄罗斯,我们从不使用mm/dd/yyyymm.dd.yy,但对于美国来说,这是一种非常常见的格式。