2016-02-13 56 views
0

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

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

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

上面的代码返回关于各种输入,比如“99/03/1”“真”(应0099/03/01)和99/1/1(应当0099/01/1) 。由于输入的字符串不是从一个来的,所以我不能执行验证,然后再将它们传递给此方法。请建议对dateformat(“yyyy/MM/dd”)采取非常严格的措施。

+0

我已经尝试过这个实现,并且它没有像上面提到的输入那样工作。 – Kiran

回答

0

好的,第一:你知道你期待的格式。那么为什么要解析它并捕获异常而不是检查先决条件?

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

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

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

感谢您的建议。可以用上面的代码覆盖simpledateformat方法。因为我必须在我的项目的许多地方进行检查。我正在验证某些方法中的多个日期。它很难在每个日期添加此检查。但如果重写是不可能的,我将与您的解决方案..感谢 – Kiran

+0

在这种情况下,你可以创建一个你自己的自定义方法,这是返回你验证以及日期格式。在这个方法中你可以使用上面的代码。这可能会帮助你。 –

0

你可以尝试使用新的java.time包从Java 8和更高版本。您可以使用它来替换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)。

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 
+0

通过这样做,您可以验证用户输入的年份有4个数字,月份有2个数字,日期有2个数字。 –