【问题标题】:How to make date formate validation in Java [duplicate]如何在Java中进行日期格式验证[重复]
【发布时间】:2020-08-13 13:48:17
【问题描述】:

我想进行日期格式验证。它应该是 yyyy-mm-dd 并且为了满足我的要求,我遵循了下面的代码,但它不起作用。

我的输入请求应该是 2020-13-08 或 2020-13-08T23:00:00Z 但应该是 2020-08-13 或 2020-08-13T23:00:00Z

public static boolean validateJavaDate(String strDate) {

        /*
         * Set preferred date format, For example MM-dd-yyyy, MM.dd.yyyy,dd.MM.yyyy etc.
         */
        SimpleDateFormat sdfrmt = new SimpleDateFormat("yyyy-mm-dd");
        sdfrmt.setLenient(false);
        try {
            Date javaDate = sdfrmt.parse(strDate);
            System.out.println(strDate + " is valid date format");
        }
        catch (ParseException e) {
            System.out.println(strDate + " is Invalid Date format");
            return false;
        }
        return true;
    }

【问题讨论】:

  • My input request should be either 2020-13-08 or 2020-13-08T23:00:00Z but it should be 2020-13-08 or 2020-13-08T23:00:00Z 不明白。你能澄清一下吗?另外,在当前代码中什么不起作用?
  • 月份的模式应该是M 而不是m。我猜你想验证第 13 个月是错误的。
  • 我的输入应该像 2020-13-08 或 2020-13-08T23:00:00Z 但这些应该是有效的格式,如 2020-08-13 或 2020-08-13T23: 00:00Z
  • @AbhiRam 您能否编辑问题以向读者澄清?
  • 我建议你不要使用SimpleDateFormat 和Date。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time API 的LocalDate 和Instant。

标签: java simpledateformat


【解决方案1】:

最好改用新的 java.time 包

public static boolean validateJavaDate(String strDate) {
    if (strDate == null || strDate.isEmpty()) { //for completeness 
        System.out.println("Given value can not be null or empty");
        return false;
    }

    DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;
    try {
        formatter.parse(strDate);
        System.out.println(strDate + " is valid date format");
        return true;
    }
    catch (DateTimeParseException e) {
        System.out.println(strDate + " is Invalid Date format");
        return false;
    }
}

如果目标是验证有无时间的日期字符串,我们可以将实际解析提取到私有方法并使用不同的格式化程序调用它

private static boolean formatDate(String string, DateTimeFormatter formatter) {
    try {
        formatter.parse(string);
        return true;
    } catch (DateTimeParseException e) {
        return false;
    }

}
public static boolean validateJavaDate(String strDate) {
    if (strDate == null || strDate.isEmpty()) { //for completeness 
        System.out.println("Given value can not be null or empty");
        return false;
    }

    boolean isValid = formatDate(strDate, DateTimeFormatter.ISO_LOCAL_DATE);
    if (!isValid) {
        isValid = formatDate(strDate, DateTimeFormatter.ISO_DATE_TIME);
    }

    if (isValid) {
        System.out.println(strDate + " is valid date format");
    } else {
        System.out.println(strDate + " is Invalid Date format");
    }

    return isValid;
}

【讨论】:

    【解决方案2】:

    yyyy-mm-dd 匹配小时分钟(mm)部分,这就是验证通过的原因。将其替换为 yyyy-MM-dd 以匹配月份。有关SimpleDateFormat 的文档,请参阅https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/text/SimpleDateFormat.html。

    【讨论】:

    • 应使用DateTimeFormatter 而不是SimpleDateFormat。
    【解决方案3】:

    另一方面,您可以手动操作。

    这样想

    public boolean isDate(String format)
    {   
      int year = format.subString(0,3); //You must validate that the subString is Integer
      int month = format.subString(5,6); //Same
      int day = format.subString(8,9); //Same
    
    
      if(month <= 12 && month >= 1)
      {
         //is valid
         if(day <= 31 && day >= 1)
         {
            if(String.valueOf(format.chatAt(4)).equals("-") && String.valueOf(format.chatAt(7)).equals("-")
            return true;
         }
      }
      .
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多