繁体   English   中英

验证以检查日期格式无法正常工作

[英]validation to check date formatting is not working as expected

我有以下代码检查有效格式日期

private void validateDate(String date){

    try {
        String validDate = "MM/dd/yyyy";    
        SimpleDateFormat format = new SimpleDateFormat(validDate);
        format.setLenient(false);
        Date theDate = new Date();
        theDate = format.parse(date);
    }
    catch (Exception e) {
    }

}  

我将日期值传递为06/25/20014。 在今年,格式是错误的,我期望它会抛出异常并进入catch内,但它从未发生,并且成功地通过了代码format.parse(date);。 由于该原因,我的应用程序未引发错误。

我还调试了format.parse(date); 并返回“ Fri Jul 31 00:00:00 MST 20015”。 我不确定为什么该行没有引发任何异常。

谢谢你的帮助!!

这实际上是记录在案的行为 (至少对于公历来说,除非您明确将其设置为其他日历,否则我认为您将使用该行为):

年:如果格式化程序的日历为公历,则将应用以下规则。

对于格式设置,如果图案字母的数量为2,则年份将被截断为2位; 否则,将其解释为数字。 对于解析, 如果模式字母的数量大于2,则将按字面意义解释年份,而不考虑数字的数量

是的,有一天20015可能是一个有效的年份;)如果要检查4位数字,则可能需要考虑在解析之前使用正则表达式匹配。

如果此行确实引发了异常,则您的程序将在9999年之后停止工作,而这通常不是您想要的。 当然,您不希望程序能够持续这么长时间,但是人们也不希望程序能够持续到y2k。 因此,Java选择不禁止访问似乎是合理的。

如果要检查年份在1到9999之间,则只需编写一个if :(请参阅相关问题, 我想从Java Date中获取Year,Month,Day等以与Java中的公历日期进行比较。 ?

Calendar cal = Calendar.getInstance();
cal.setTime(date);
if (cal.get(Calendar.YEAR) > 9999)
    throw new RuntimeException("Blah");

在SimpleDateFormat的标准日期格式中,数字y不一定与数字位数相对应(它不是正则表达式)。 一个或两个y是2位数字年份的指标(15、98等),而3个或更多y是全年的指标。

我可以看到提供的日期是有效的(尽管提前18k年)

public static void validateDate(String date){

    try {
        String validDate = "MM/dd/yyyy";    
        SimpleDateFormat format = new SimpleDateFormat(validDate);
        format.setLenient(false);
        Date theDate = format.parse(date);
        Calendar c = new GregorianCalendar();
        c.setTime(theDate);
        int year = c.get(Calendar.YEAR);
        int month  = c.get(Calendar.MONTH);
        int day  = c.get(Calendar.DAY_OF_MONTH);
        int pos = c.get(Calendar.DAY_OF_WEEK);
        if (Calendar.WEDNESDAY == pos) 
          System.out.print("day is Wednesday on " + year + "/" + (month+1) + "/" + day);
    }
    catch (Exception e) {
       System.out.print("Inside exception block " + e);
    }
}

印刷品:日期为20014/6/25的星期三

如果您需要一些年度验证,则可以添加其他支票

if (year > MAX_YEAR) {
  // add error here
}

这是演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM