简单日期格式问题Java

时间:2016-02-13 06:24:20

标签: java datetime simpledateformat

我正在开展一个项目,我需要根据长度和模式验证多个日期。我使用简单的日期格式,发现了很多问题。我的要求是严格允许日期字符串匹配" yyyy / MM / dd"严格限制10个字符。

以下代码未给出各种测试输入字符串的预期结果。

public static boolean checkformat(String dateString){
        boolean flag = false;
        Date d1 = null;
        SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
        format.setLenient(false);
        try {
            d1 = format.parse(dateString);
            flag=true;
        } catch (ParseException ex) {
            ex.printStackTrace();
            return false;
        }
        return flag;
    }

上面的代码正在返回" true"对于各种输入,如" 99/03/1" (应为0099/03/01)和99/1/1(应为0099/01/1)。由于输入字符串不是来自from,因此我无法在将它们传递给此方法之前执行验证。请建议任何对dateformat都非常严格的实施(" yyyy / MM / dd")。

4 个答案:

答案 0 :(得分:1)

我建议您在格式化之前尝试使用正则表达式验证日期。

用户下面的验证代码

public static boolean checkformat(String dateString){
        boolean flag = false;
        Date d1 = null;
        SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
        format.setLenient(false);
        try {
             if (dateString.matches("([0-9]{4})/([0-9]{2})/([0-9]{2})")) { // use this regex
               d1 = format.parse(dateString);
               flag=true;
             }
        } catch (ParseException ex) {
            ex.printStackTrace();
            return false;
        }
        return flag;
    }

答案 1 :(得分:0)

好的,首先:你知道你的预期格式。那么为什么只解析它并捕获异常而不是检查前置条件?

if(dateString.size() > 10) {
...

你实际做的不是检查你的输入格式而是解析它 - 虽然方法没有表达这个合同 - 所以,如果您的方法仅用于检查,您可以: 1.使用正则表达式 2. ...? 我知道在网上建议使用SimpleDateFormat的安静很多,但是 - 坦率地说 - 他们错了。 如果我期待给定的格式,例如因为我知道已经对一些用户输入进行了转换,我可以开始解析一个字符串,并考虑到某些内容可能出错,捕获异常。如果我不知道哪种格式传递给我,我就在验证层,这个层不应该尝试执行转换,而是证明转换是有效的。

答案 2 :(得分:0)

您可以尝试使用Java 8及更高版本中的新java.time包。您可以使用它来替换SimpleDateFormat:

public static boolean checkformat(String dateString){
    boolean flag = false;

    try {
        TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyyMMdd").parse(strDate);
        flag=true;
    } catch (DateTimeParseException ex) {
        ex.printStackTrace();
        return false;
    }
    return flag;
}

这也会限制价值没有意义(例如月值为18)。

答案 3 :(得分:0)

String[] removeSlashes=new String[3];
removeSlashes = enteredDate.split("/");

if(removeSlashes[0].length()!=4)
     throw new IncorrectDateFormatException(); // user defined exception
if(removeSlashes[1].length()!=2)
     throw new IncorrectDateFormatException();
if(removeSlashes[2].length()!=2)
     throw new IncorrectDateFormatException();

//Then use SimpleDateFormat to verify