当前位置: 首页 > news >正文

为什么阿里开发手册不建议使用Date类?

在日常编码中,基本上99%的项目都会有一个DateUtil工具类,而时间工具类里用的最多的就是java.util.Date。

大家都这么写,这还能有问题??

当你的“默认常识”出现问题,这个打击,就是毁灭性的。

但是,在进行安全扫描的时候,提示java.util.Date存在安全漏洞。

👉 GPT功能:

  1. GPT-4o知识问答:支持1000+token上下文记忆功能
  2. 最强代码大模型Code Copilot:代码自动补全、代码优化建议、代码重构等
  3. DALL-E AI绘画:AI绘画 + 剪辑 = 自媒体新时代
  4. 私信哪吒,直接使用GPT-4o

在这里插入图片描述

public class DateUtil {/*** 日期格式化*/public static String formatDate(Date date, String format) {SimpleDateFormat sdf = new SimpleDateFormat(format);return sdf.format(date);}/*** 字符串转Date*/public static Date parseDate(String dateStr, String format) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat(format);return sdf.parse(dateStr);}/*** 获取指定格式的当前时间*/public static String getCurrentDate(String format) {// 获取当前时间Date currentDate = new Date();// 定义日期格式SimpleDateFormat dateFormat = new SimpleDateFormat(format);return dateFormat.format(currentDate);}
}

把组件风险列表截图+DateUtil工具类发给我的编程小助手ChatGPT4o。

Prompt:在进行安全扫描的时候,提示java.util.Date存在安全漏洞,有什么漏洞,如何解决?

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Date;public class DateUtil {// 日期格式化public static String formatDate(LocalDateTime dateTime, String format) {DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);return dateTime.format(formatter);}// 字符串转Datepublic static LocalDateTime parseDate(String dateStr, String format) {DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);return LocalDateTime.parse(dateStr, formatter);}// 获取指定格式的当前时间public static String getCurrentDate(String format) {// 获取当前时间LocalDateTime currentDate = LocalDateTime.now();// 定义日期格式DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern(format);return currentDate.format(dateFormat);}// 将 java.util.Date 转为 java.time.LocalDateTimepublic static LocalDateTime convertToLocalDateTime(Date date) {return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());}// 将 java.time.LocalDateTime 转为 java.util.Datepublic static Date convertToDate(LocalDateTime dateTime) {return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());}
}

以下是Date设计上的主要缺陷:

1、Date 这个名称本身就具有误导性。它实际上表示的是一个时间点,而非日期。因此,更为恰当的名称应为 Instant,这与 java.time 中的对应类型相符。

2、它不是一个最终类,这导致了诸如 java.sql.Date 等不良的继承使用。java.sql.Date 旨在表示一个日期,但由于名称相同而常常引起混淆。

3、Date 是可变的,而日期/时间类型通常是自然值,适合用不可变类型进行建模。Date 的可变性(例如通过 setTime 方法)迫使开发人员不得不创建大量防御性副本,以确保代码的安全性。

4、Date 在许多地方(包括 toString() 方法)隐式使用系统本地时区,这常常让开发人员感到困惑。更多细节可以参见“时间点是什么”部分。

5、Date 的月份编号从 0 开始,这是借鉴自 C 语言的设计。这种设计导致了大量的“偏一”错误。同样,年份编号从 1900 开始,也是借鉴自 C 语言。显然,当 Java 出现时,我们已经意识到这种设计不利于代码的可读性。

6、Date 的方法命名也不清晰。getDate() 方法返回的是月中的某一天,而 getDay() 方法返回的是星期几。给这些方法起更具描述性的名称并不会很困难,但遗憾的是,这并未实现。

7、对于是否支持闰秒,Date 的表现也不明确。文档中指出“一秒钟由一个 0 到 61 的整数表示;60 和 61 仅在实际正确跟踪闰秒的 Java 实现中出现。” 我强烈怀疑,大多数开发人员(包括我自己)都默认认为 getSeconds() 方法的返回值范围是 0-59。

8、Date 类的方法对参数范围的要求非常宽松,这没有明显的理由。例如,方法允许日期参数为 1 月 32 日,并解释为 2 月 1 日。这种宽松的参数范围在实际应用中并不常见,反而增加了使用的复杂性和出错的风险。

尽管还能找到更多的问题,但那会显得过于挑剔。

👉 GPT功能:

  1. GPT-4o知识问答:支持1000+token上下文记忆功能
  2. 最强代码大模型Code Copilot:代码自动补全、代码优化建议、代码重构等
  3. DALL-E AI绘画:AI绘画 + 剪辑 = 自媒体新时代
  4. 私信哪吒,直接使用GPT-4o

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • rust 初探 -- 路径(path)
  • 嵌入式必备知识总结(一)
  • 多模态大模型
  • 基于Laravel打造,模块化开发框架助力项目快速落地 Modstart
  • 黑马JavaWeb后端案例开发(包含所有知识点!!!)
  • Serverless Knative冷启动与自动扩缩容研究:从原理到实践
  • 数据结构之《栈》
  • Redis:十大数据类型
  • react antd upload custom request处理多个文件上传
  • letcode - string
  • springboot rbac Security
  • 向量数据库(二):Qdrant
  • 2024网络安全学习路线 非常详细 推荐学习
  • Kafka面试三道题
  • 感知融合算法学习1
  • android 一些 utils
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Java超时控制的实现
  • Java基本数据类型之Number
  • linux学习笔记
  • react-native 安卓真机环境搭建
  • SQLServer之索引简介
  • 悄悄地说一个bug
  • -- 数据结构 顺序表 --Java
  • 无服务器化是企业 IT 架构的未来吗?
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • linux 淘宝开源监控工具tsar
  • Nginx实现动静分离
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​Spring Boot 分片上传文件
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (31)对象的克隆
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Java入门)抽象类,接口,内部类
  • (阿里云万网)-域名注册购买实名流程
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • ******之网络***——物理***
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET是什么
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @Autowired和@Resource的区别
  • @Value获取值和@ConfigurationProperties获取值用法及比较(springboot)
  • [Android]一个简单使用Handler做Timer的例子
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [BZOJ1053][HAOI2007]反素数ant
  • [BZOJ1060][ZJOI2007]时态同步 树形dp
  • [C#]使用C#部署yolov8的目标检测tensorrt模型
  • [Doris]阿里云搭建Doris,测试环境1FE 1BE
  • [HEOI2013]ALO