java中SimpleDateFormat解析日期格式的问题

在日常写代码的过程中,我们经常要处理各种格式的日期,常见的日期格式有:"20240601","2024-06-01","2024-6-1"。如何正确地处理日期格式,尤其是对外接口中参数的日期格式,就很重要了,一个不小心就可能出现意想不到的问题。

举一个我遇到的真实例子:我们提供的对外接口中有一个参数是日期,定义的格式是"yyyyMMdd",就是说我们要求用户在调用接口的时候要传"20240601"这样格式的日期,但是,接口提供出去,怎么用就是别人的事了...你会发现经常有用户调用接口的时候,传"2024-06-01"这样格式的日期。如果我们不对格式做校验会出现什么问题呢?

复制代码
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    Date d = sdf.parse("2024-06-01");
    System.out.println(sdf.format(d));

你猜上面这段代码的输出是什么?

是:20231206

出现的问题就是:用户希望查2024年6月1日的数据,接口返回的却是2023年12月6日的数据。

如何避免这个问题?我们需要对日期格式做强校验,当用户传的日期格式不是我们希望的日期格式的时候,我们就通过报错来提示用户。

正好SimpleDateFormat父类DateFormat提供了一个方法:public void setLenient(boolean lenient),这个方法可以控制是否容忍不正确的日期格式,它默认是true,我们需要改成false。就是不容忍错误格式,对格式做强验证。上面的代码可以改成:

复制代码
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    sdf.setLenient(false);
    Date d = sdf.parse("2024-06-01");
    System.out.println(sdf.format(d));

再运行上面的代码会抛出异常:Exception in thread "main" java.text.ParseException: Unparseable date: "2024-06-01"

当然,如果你不需要严格的日期校验,不希望代码抛异常,希望代码运行得更健壮,你就不要加这句:sdf.setLenient(false); 你需要根据实际情况来做决定。

以上就是我遇到过的SimpleDateFormat解析日期格式的问题。如果你有什么疑问,欢迎留言跟我讨论。


著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

https://wangxuan.me/tech/2024/06/03/validate-date-format-with-SimpleDateFormat.html

相关推荐
donotshow5 分钟前
Spring Boot 整合 ShedLock 处理定时任务重复
java·后端
不够优雅17 分钟前
【Concept Plugin 3】轻量级插件化解决方案|动态类加载
java·spring boot·spring cloud
程序员三明治1 小时前
选 Redis Stream 还是传统 MQ?队列选型全攻略(适用场景、优缺点与实践建议)
java·redis·后端·缓存·rocketmq·stream·队列
Cosmoshhhyyy4 小时前
《Effective Java》解读第5条:优先考虑依赖注入来引用资源
java
.柒宇.5 小时前
力扣hot100----15.三数之和(java版)
java·数据结构·算法·leetcode
程序员卷卷狗6 小时前
JVM 调优实战:从线上问题复盘到精细化内存治理
java·开发语言·jvm
cj6341181506 小时前
【MySQL】mysqldump使用方法
java·后端
JIngJaneIL6 小时前
停车场管理|停车预约管理|基于Springboot的停车场管理系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·后端·论文·毕设·停车场管理系统
杰克尼7 小时前
二分查找为什么总是写错
java·数据结构·算法
半旧夜夏9 小时前
【分布式缓存】Redis持久化和集群部署攻略
java·运维·redis·分布式·缓存