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

相关推荐
小白说大模型3 小时前
从向量嵌入到复杂 Agent:LLM、LangChain、LangGraph 完整科普
java·开发语言·人工智能·gpt·深度学习·langchain
zhanghaha13144 小时前
Python语言基础:4_数据类型转换
java·前端·python
Devin~Y5 小时前
互联网大厂Java面试实战:Spring Boot、MyBatis、Redis、Kafka、JWT、Spring Cloud 与 AI 场景追问
java·spring boot·redis·spring cloud·kafka·mybatis·spring security
花生了什么事o5 小时前
DDD:领域驱动设计的初步认识
java·数据库
BGK1123585 小时前
基于qemu_v8+optee 4.00 平台构建 ca/ta
java·大数据·数据库
何中应6 小时前
Spring Boot整合Doris
java·数据库·spring boot
笨笨饿6 小时前
101_详解USB协议
java·jvm·数据结构
遨游DATA6 小时前
Maven dependencyManagement 已声明却仍缺 Jar:如何验证最终运行包
java·spring boot·maven·故障排查·依赖管理
腻害兔6 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 认证与权限:RBAC + 数据权限,这套“门禁系统“到底怎么设计的?
java·vue.js·人工智能·产品经理·ai编程
Summer-Bright7 小时前
深度 | Agent 协议标准化:一场决定了 AI 经济底层规则的基础设施战争
java·数据库·人工智能·ai