java中date表示精确时间点(毫秒数),calendar负责日期字段操作,二者配合simpledateformat实现格式化与解析,但均已过时,推荐使用java.time包。

Java 中处理日期,Date 和 Calendar 是两个基础但必须掌握的类。Date 侧重表示一个精确的时间点,Calendar 则负责对年、月、日等字段进行读取、设置和运算。两者配合 SimpleDateFormat 可完成常见格式化与解析任务,但要注意它们已不推荐用于新项目——java.time 才是现代标准。
Date 类:表示时间点
Date 的核心作用是记录“某一瞬”,以自 1970-01-01 00:00:00 UTC 起的毫秒数为基准。
- 创建当前时间:Date now = new Date();
- 获取时间戳:long millis = now.getTime();
- 用毫秒构造指定时间:Date d = new Date(1748500000000L);(对应 2025-05-28 左右)
- 比较两个时间:date1.after(date2)、date1.before(date2) 或直接比毫秒值
- 注意:getYear()、getMonth() 等方法已废弃,不要使用
Calendar 类:操作日期字段
Calendar 不是直接 new 出来的,而是通过 Calendar.getInstance() 获取,默认基于系统时区。
- 获取字段值:月份从 0 开始,所以要 +1;星期日为第 1 天,DAY_OF_WEEK 返回 1~7
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
int weekday = cal.get(Calendar.DAY_OF_WEEK) - 1; // 转为周一=0 - 设置日期:cal.set(2026, Calendar.JUNE, 25);(注意:June 是 5,但 set 方法接受常量更安全)
- 增减日期:cal.add(Calendar.DAY_OF_MONTH, 10); 加 10 天
cal.add(Calendar.MONTH, -3); 减 3 个月
Date 与 Calendar 相互转换
实际开发中常需二者协作:用 Calendar 做运算,再转回 Date 输出或存储。
- Date → Calendar:Calendar cal = Calendar.getInstance(); cal.setTime(date);
- Calendar → Date:Date date = cal.getTime();
- 这个组合特别适合“今天加 15 天再格式化”这类流程
格式化与解析:离不开 SimpleDateFormat
Date 和 Calendar 本身不提供字符串格式能力,必须借助 SimpleDateFormat。
- 格式化 Date:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
- 解析字符串:sdf.parse("2026-06-25 03:29:00");
- 关键提醒:SimpleDateFormat 不是线程安全的,多线程场景下应避免复用同一实例,建议每次使用都新建,或改用 DateTimeFormatter(java.time)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











