【问题标题】:Convert String to Date - Date Validation将字符串转换为日期 - 日期验证
【发布时间】:2011-12-19 13:31:34
【问题描述】:

当用户以错误的格式输入日期时,我收到空指针异常。

字符串转日期的方法

 Date stringToDate(String dateString) {

        Date returnDate = null;
        if (dateString!= null && dateString.length() > 0 && isValidDate(dateString)) {
            returnDate = dateFormat.parse(dateStr);
        }
        return returnDate;
    }

boolean isValidDate(String date) {
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");  
    Pattern datePattern = Pattern.compile("[0-9]{2}/[0-9]{2}/[0-9]{4}");
    Matcher datePatternMatch = datePattern.matcher(date);

    boolean datePatternMatchfound = datePatternMatch.matches();

    if(date==null){
        return false;
    } else if(date!=null && date.length()>0){       
        if(datePatternMatchfound){
            sdf.setLenient(false);
            sdf.parse(date.trim());
        }
        return true;
    } else {
        return false;
    }  
}

我只是想知道......

1) 日期的有效模式应该是什么?

2) 如果用户输入错误的日期 stringToDate 方法肯定会失败并抛出空指针异常。如何避免?

任何帮助将不胜感激。

【问题讨论】:

  • 根据您使用 JSF 的问题历史记录。如果您确实将它用于 JSF 输入字段,那么您完全错误地处理了这个问题。

标签: java regex validation date-format


【解决方案1】:

您假设 SimpleDateFormat(MM-dd-yyyyas 是用户将输入的默认模式,您应该确保您的用户只能输入 SimpleDateFormat,或者您应该在 isValidDate() 中进行更改以接受

【讨论】:

    【解决方案2】:

    日期表示的正确格式完全取决于您的应用程序和用户区域设置。但是,您可以将输入格式限制为某种格式,并使用它来解析和格式化日期输入。

    您可以捕获parse 方法抛出的ParseException 并在您的catch 子句中处理无效情况。

    例如,您的代码可以简化为:

    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    
    Date stringToDate(String dateString) {
      try {
        Date returnDate = sdf.parse(dateString);
        // do something with returnDate, if necessary
        return returnDate;
      } catch(ParseException e) {
        // Date is not valid, handle invalid cases here..
        return null; // Not a good practice, you probably would throw an Exception
      }
    }
    

    您可以使用相同的格式化程序通过调用sdf.format(someDate) 方法并获取字符串表示形式在用户界面中显示您的值。

    【讨论】:

    • 即使我删除了模式匹配条件,并且用户输入了一些随机数值,它也会产生解析问题。日期格式在“MM/dd/yyyy”中定义
    • 我将答案改为使用斜杠,而不是破折号。
    【解决方案3】:

    有一件事是你需要在你的验证方法中更具防御性。

    在您显示的代码中,您可以这样做:

    Matcher datePatternMatch = datePattern.matcher(date);
    

    在检查日期字符串是否为空之前。 Pattern.matcher(null) 导致 NullPointerException。

    因此,您需要在 if (date != null) 条件块中移动此代码。

    除此之外,在使用 DateFormat 验证日期字符串之前,使用正则表达式验证日期字符串并没有什么好处。正则表达式验证不会给您带来任何额外的好处。

    【讨论】:

      【解决方案4】:
      1. 有效的模式格式取决于例如系统的国家/地区设置。

      2. 您应该将 isValidDate() 方法的内容放在 try-catch 块中以避免异常。

      【讨论】:

        【解决方案5】:

        通过使用Simple date format 类,我们可以验证string 是否为日期。您需要确保将 setLenient(false) 设置为 simple date format 对象。

        如果未设置,您最终会遇到四舍五入的问题。例如,宽松的 GregorianCalendar 将 MONTH == JANUARY, DAY_OF_MONTH == 32 解释为 2 月 1 日。

        示例代码:

        http://www.vijayakumarg.co.in/2014/04/how-to-validate-date-string-in-java.html

        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("MM/dd/yyyy");
            sdfrmt.setLenient(false);
            /* Create Date object */
            Date javaDate = null;
            /* parse the string into date form */
            try
            {
                javaDate = sdfrmt.parse(strDate);
                System.out.println("Date after validation: " + javaDate);
            }
            /* Date format is invalid */
            catch (ParseException e)
            {
               System.out.println("The date you provided is in an " +"invalid date format.");
               return false;
            }
            /* Return 'true' - since date is in valid format */
            return true;
        
        }
        

        【讨论】:

          猜你喜欢
          • 2011-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-27
          • 2020-05-21
          相关资源
          最近更新 更多