java.util.Date 对象是否验证日期有效性



我刚刚写了这个单元测试:

@Test
public void testGetDateFromString() throws ParseException{
    String date = "52/29/2500";
    Date dateFromString = DateHelper.getDateFromString(date, DateHelper.DD_MM_YYYY_FORMAT);
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DateHelper.DD_MM_YYYY_FORMAT);
    Date dateWithSimpleFormat = simpleDateFormat.parse(date);
    Assert.assertNotNull(dateFromString);
    Assert.assertNotNull(dateWithSimpleFormat);
    Assert.assertTrue(dateFromString.equals(dateWithSimpleFormat));
    System.out.println("dateFromString " + dateFromString);
    System.out.println("dateWithSimpleFormat " + dateWithSimpleFormat);
}

输出为:

dateFromString Wed Jun 21 00:00:00 CEST 2502
dateWithSimpleFormat Wed Jun 21 00:00:00 CEST 2502

DateHelper.DD_MM_YYYY_FORMAT模式是dd/MM/yyyy的,getDateFromString 是一种使用库将字符串日期解析为 Date 对象的方法commons-lang

为什么 des java.util.Date 对象验证日期有效性?

您需要

设置simpleDateFormat.setLenient(false);以使SimpleDateFormat严格验证您的输入。

您可以参考 setLenient 文档以进一步了解。根据定义,

Specify whether or not date/time parsing is to be lenient. With lenient parsing, 
the parser may use heuristics to interpret inputs that do not precisely match this 
object's format. With strict parsing, inputs must match this object's format.

使用 simpleDateFormat.setLenient(false); 启用严格解析。

java.time

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
    String date = "52/29/2500";
    try {
        LocalDate dateWithJavaTime = LocalDate.parse(date, dateFormatter);
        System.out.println("dateWithJavaTime " + dateWithJavaTime);
    } catch (DateTimeParseException dtpe) {
        System.out.println("Invalid date. " + dtpe);
    }

此代码的输出为:

无效的日期.java.时间.格式.日期时间解析异常:文本 无法解析"52/29/2500":年月值无效(有效( 值 1 - 12(:29

请享受不仅验证有效,而且享受错误消息的精度。

其他结果:

  • 对于字符串52/11/2500结果为"无效日期。java.time.format.DateTimeParseException:无法解析文本"52/11/2500":月份中的天数值无效(有效值 1 - 28/31(:52"。
  • 对于字符串29/02/2019我们得到"dateWithJavaTime 2019-02-28",这可能会令人惊讶。要拒绝此字符串,请使用

        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu")
                .withResolverStyle(ResolverStyle.STRICT);
    

    现在我们得到

    无效的日期.java.时间.格式.日期时间解析异常:文本 无法解析"29/02/2019":将日期"2 月 29 日"无效为"2019" 不是闰年

    再次享受消息的精确性。

最新更新