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

Java 项目中使用 java.util.Date

在 Java 项目中,java.util.Date是早期处理日期时间的核心类,但它存在设计缺陷且已被逐步替代。以下从基础使用、核心问题、替代方案三方面梳理,帮你规范处理日期时间场景:

一、java.util.Date 基础使用(兼容旧代码)

Date本质存储的是从 1970-01-01 00:00:00 GMT 开始的毫秒数,核心操作如下:
java
 
运行
 
 
 
 
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.TimeZone;public class DateDemo {public static void main(String[] args) {// 1. 创建Date对象Date now = new Date(); // 当前系统时间Date specifyDate = new Date(1740000000000L); // 指定毫秒数创建// 2. 日期格式化(SimpleDateFormat非线程安全,需注意)SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 设置时区String formatted = sdf.format(now);System.out.println("格式化后:" + formatted);// 3. 解析字符串为Date(需捕获ParseException)try {Date parseDate = sdf.parse("2025-05-22 10:00:00");System.out.println("解析后毫秒数:" + parseDate.getTime());} catch (Exception e) {e.printStackTrace();}// 4. 时间比较boolean isAfter = now.after(specifyDate);boolean isBefore = now.before(specifyDate);}
}
 

二、java.util.Date 的核心问题(不推荐新项目使用)

  1. 设计缺陷
    • 可变性:DatesetTime()等方法可修改实例,线程不安全;
    • 语义模糊:Date既存日期又存时间,但无时区信息(默认基于系统时区),易引发时区错乱;
    • 月份从 0 开始(0=1 月,11=12 月),年份从 1900 开始,极易出错。
  2. 工具类问题
    • SimpleDateFormat非线程安全,多线程环境下易出现解析异常;
    • 缺乏日期计算 API(如加 / 减天数、月份),需手动封装。

三、推荐替代方案(Java 8+ 优先使用)

Java 8 引入java.time包(JSR 310),完全替代Date,核心类如下:
类名 用途 不可变 时区支持
LocalDate 仅日期(yyyy-MM-dd)
LocalTime 仅时间(HH:mm:ss)
LocalDateTime 日期 + 时间(无时区)
ZonedDateTime 日期 + 时间 + 时区
DateTimeFormatter 日期格式化(线程安全)

替代示例(实现上述 Date 功能):

java
 
运行
 
 
 
 
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;public class LocalDateTimeDemo {public static void main(String[] args) {// 1. 获取当前时间(上海时区)LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));// 2. 格式化(DateTimeFormatter线程安全)DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String formatted = now.format(formatter);System.out.println("格式化后:" + formatted);// 3. 解析字符串LocalDateTime parseTime = LocalDateTime.parse("2025-05-22 10:00:00", formatter);// 4. 时间计算(无需手动封装)LocalDateTime nextDay = now.plusDays(1); // 加1天LocalDateTime lastMonth = now.minusMonths(1); // 减1个月// 5. 转换为Date(兼容旧代码)Date date = Date.from(now.atZone(ZoneId.systemDefault()).toInstant());}
}
 

四、兼容旧代码的建议

  1. 若项目仍需使用Date,避免直接修改实例,多线程环境下SimpleDateFormat需使用ThreadLocal封装;
  2. 新功能优先用java.time,通过Instant(时间戳)实现Date与新 API 的互转:
    java
     
    运行
     
     
     
     
    // Date → Instant → LocalDateTime
    Date oldDate = new Date();
    LocalDateTime newTime = LocalDateTime.ofInstant(oldDate.toInstant(), ZoneId.systemDefault());// LocalDateTime → Instant → Date
    Date newDate = Date.from(newTime.atZone(ZoneId.systemDefault()).toInstant());
     
     
总结:java.util.Date仅适配老项目维护,新项目务必使用java.time包,既解决线程安全问题,又简化日期计算与时区处理。
http://www.zskr.cn/news/120862.html

相关文章:

  • 3大好处揭秘:会议速记与纪要服务如何精准记录信息实现知识沉淀
  • Revit 200+新功能之“明周科技功能商店 AI推荐助手”
  • Kotaemon优惠券发放策略:精准营销触发
  • C++ Protobuf 赋值全解析:set、add、mutable 到底怎么用?
  • 赢取千元奖品!TextIn大模型加速器+火山引擎,多语言文档处理挑战营正式启动!
  • AI元人文:技术哲学的跃迁宣言——意义行为原生
  • 43、互联网连接规划与远程访问策略制定
  • Kotaemon代码执行沙箱:安全运行Python脚本
  • 国内口碑好的低代码开发平台产品排名
  • JavaSE——Java跨平台工作原理
  • 10 个AI论文工具,助本科生轻松搞定毕业写作!
  • 市面上功能全的低代码开发平台工具排名
  • 基于Kotaemon的企业知识大脑建设方案
  • 2025年12月新加坡公司注册代理服务商综合评估与选型分析 - 2025年品牌推荐榜
  • 24、Kubernetes 持续交付与 Pod 管理全解析
  • 47、远程访问安全策略规划指南
  • JavaSE——Dos命令提示符
  • 49、网络技术与系统管理综合解析
  • 2026 量化交易外汇 API 选型指南:从延迟到数据,一文说透核心逻辑
  • 面试官:Java多线程和JUC你懂吗?谢飞机:我飞过!——互联网大厂技术面试搞笑实录(一)
  • 15、SharePoint自定义Web部件开发指南
  • 【毕设项目计算机毕设】基于springboot+vue实现的员工管理系统视频讲解数据库项目源码
  • Kotaemon畜牧业疾病诊断辅助工具
  • 文科论文写作全流程指南(含核心要点与实操方法)​
  • 2025年12月泰国公司注册代理服务商全景选型指南 - 2025年品牌推荐榜
  • 19、利用业务连接服务集成业务线数据
  • 手机端AIDE安卓手电筒软件代码
  • 165页满分PPT | 某商贸企业数字化蓝图整体规划方案
  • 21、利用 Silverlight 为 SharePoint 创建增强用户体验
  • SPSS——对应分析基础