Java日期工具类时间校验实现

 更新时间:2023年12月28日 11:31:03   作者:布丁吖  
一般项目中需要对入参进行校验,比如必须是一个合法的日期,本文就来介绍一下Java日期工具类时间校验实现,具有一定的参考价值,感兴趣的可以了解一下

嘚吧嘚

时间校验这个问题,我在网上找了很多资料,有用正则表达式的、有用格式工具类的。
其实都能实现时间校验,既然两种方式都能实现,那么使用哪种方式更好呢?

先告诉大家一个结论吧,我更倾向于用日期工具类来实现。接下来给大家分析一下。

正则表达式

版本一

先来看一个简单的日期的正则表达式的规则,年份4位数字,月份2位数字,日2位数字,时2位数字,分2位数字,秒2位数字。

String regex = "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$";

但是日期校验真的是简单的几位数字的组合吗?咱们来做个测试

在这里插入图片描述

注意看第二个日期“2022-13-31 32:12:21”,这明显是个错误的日期,没有13月,也没有32时,但是根据正则表达式来判断的话,是符合规则的。所以说明我们的正则表达式的规则是不完善的。

版本二

1、年的规则就是4位数字(这里就这么简单,也可以从19XX年开始)
2、月的2位数字的范围是01-12
3、日的2位数字的范围是01-31
4、时的2位数字的范围是00-23
5、分的2位数字的范围是00-59
5、秒的2位数字的范围是00-59

于是可以得到下面这个正则表达式:

String regex = "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) ([0-2][0-3]):([0-5][0-9]):([0-5][0-9])$";

进过测试可以看到2022-13-31 32:12:21这个日期已经被判定为错误日期了。

在这里插入图片描述

可是这就完了吗?当然没有,在来看个例子:

在这里插入图片描述

日期中还有一个特点就是,每4年会闰年,所以2月的最后一天到几号,就不是那么简单了

所以现在的表达式还需要完善闰年的规则。。。

版本三

闰年的规则如下:
(不知道的赶紧学习一下,这都不知道,太丢人了🥴)

一般的年份:除以4,有余数的是平年,没有余数的是闰年,
整百的年份(世纪年):那么该年份除以400,有余数的是平年,没有余数的是闰年。

在这里插入图片描述

OK,规则有了,那开始写正则表达式吧!

String regex = "这个正则表达式我写不出来😭。写不出来的原因:正则表达式说白了只是个模板,好像不能做复杂的逻辑判断。"

既然自己写不出来,那就去网上查一下资料,看一下其他大神是怎么实现的。

在这里插入图片描述

我找到一个判断闰年的,但是前提是他把年份的范围规定死了,然后把闰年穷举出来,然后做一个简单的逻辑控制。

也算是一定范围内实现了日期格式的判定。

也是这个原因让我放弃了用正则表达式,本人对正则表达式研究比较浅薄,如果真的可以实现还希望大佬们可以指点一下。

SimpleDateFormat工具类

使用SimpleDateFormat工具类,就不需要考虑规则了,这些人家都考虑好了,咱们只需要定义日期格式就行了。

主要原理是:SimpleDateFormat不能格式化、格式化不对的时间字符串都是不符合规则的。

核心代码如下:

public static boolean isValidDate(String dateStr, String dateFormatPattern) {
    SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormatPattern);
    dateFormat.setLenient(false);
    try {
        Date parsedDate = dateFormat.parse(dateStr);
        return dateStr.equals(dateFormat.format(parsedDate));
    } catch (ParseException e) {
        return false;
    }
}

再封装一层

public static boolean isValidDate(String dateStr) {
    return isValidDate(dateStr, "yyyy-MM-dd HH:mm:ss");
}

测试一下,可以看到日期字符串日期格式只要有一点不一致,就会被判定为不符合规则。

在这里插入图片描述

然后再测试几个错误时间,可以看到2022-13-31 32:12:212023-02-31 00:15:00都被判定为格式错误了!

在这里插入图片描述

终于整理完了!

其实结果很简单,但是我觉得过程也很重要,虽然走了很多弯路,但是值得被记录下来。😊

本来还有想梳理一下关于LocalDate东西,和java.util.Date对比一下,有什么区别,但是考虑到篇幅。。。就不放在一起了。👋

到此这篇关于Java日期工具类时间校验实现的文章就介绍到这了,更多相关Java日期时间校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java导出Excel通用方法的实例详解

    java导出Excel通用方法的实例详解

    这篇文章主要介绍了java导出Excel通用方法的实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • 使用maven创建普通项目命令行程序详解

    使用maven创建普通项目命令行程序详解

    大部分使用maven创建的是web项目,这里使用maven创建一个命令行程序,目的是让大家了解maven特点和使用方式,有需要的朋友可以借鉴参考下
    2021-10-10
  • 解决lombok 父类和子类builder不兼容的问题

    解决lombok 父类和子类builder不兼容的问题

    这篇文章主要介绍了解决lombok 父类和子类builder不兼容的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 浅聊一下Java中的锁机制

    浅聊一下Java中的锁机制

    Java中的锁机制是保证多线程并发访问共享资源安全性的重要手段之一。Java提供了两种类型的锁机制:synchronized关键字和Lock接口。本文将介绍这两种锁机制的原理及使用方法,并通过代码示例讲解它们的使用
    2023-03-03
  • jdbc和mybatis的流式查询使用方法

    jdbc和mybatis的流式查询使用方法

    有些时候我们所需要查询的数据量比较大,但是jvm内存又是有限制的,数据量过大会导致内存溢出。这个时候就可以使用流式查询,本文就主要介绍了jdbc和mybatis的流式查询,感兴趣的可以了解一下
    2021-11-11
  • 使用Java进行FreeMarker的web模板开发的基础教程

    使用Java进行FreeMarker的web模板开发的基础教程

    这篇文章主要介绍了使用Java进行FreeMarker模板引擎开发的基础教程,文中针对FreeMarker的网页标签用法给出了一些例子,需要的朋友可以参考下
    2016-03-03
  • 如何基于ssm框架实现springmvc拦截器

    如何基于ssm框架实现springmvc拦截器

    这篇文章主要介绍了如何基于ssm框架实现springmvc拦截器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • MyBatis复杂Sql查询实现示例介绍

    MyBatis复杂Sql查询实现示例介绍

    在利用mybatis做查询的时候,一般返回结果用resulttype,这种情况必须是查询的结果在对应 的pojo类中有对应的,一般都是单表查询,但是对于一些复杂的情况,比如需要用到多表查询的时候,resultType不再适用,此时一般用resultMap来表示返回的结果
    2022-12-12
  • 关于activemq安装配置以及启动错误的解决

    关于activemq安装配置以及启动错误的解决

    这篇文章主要介绍了关于activemq安装配置以及启动错误的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 关于Java中的实体类要 implements Serializable的原因分析

    关于Java中的实体类要 implements Serializable的原因分析

    这篇文章主要介绍了Java中的实体类为什么要 implements Serializable,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06

最新评论