适合 Java 初学者、准备面试或需要系统梳理时间 API 的同学,内容较详细,建议收藏反复看。
Java 时间类(上):JDK7 及以前时间类 Date、SimpleDateFormat、Calendar 最全总结 🕒
📝 文章摘要
- 阅读时长:10 分钟
- 适合人群:
- Java 零基础小白 → 重点看:概念、构造方法、代码示例
- 正在学习 Java 常用类的同学 → 重点看:格式转换、日历字段、易错点
- 面试复习 → 重点看:月份从 0 开始、星期规则、时间毫秒值
- 本文内容:系统讲解 JDK7 及以前传统时间 API,包括时间单位、Date、SimpleDateFormat、Calendar 四大核心知识点,附带完整代码 + 细节说明。
一、时间相关基础知识点 ⏱
在学习 Java 时间类之前,我们先搞懂时间标准和单位换算,这是所有时间类的底层基础。
1. 时间标准
- GMT(Greenwich Mean Time):格林尼治时间,老式标准时间
- UTC(Coordinated Universal Time):世界协调时间,目前使用原子钟计时,是现代标准
2. 时间单位与换算
单位从小到大:秒 (s) → 毫秒 (ms) → 微秒 (μs) → 纳秒 (ns) → 皮秒 (ps) → 飞秒 (fs)
相邻单位进率:1000
公式:
1s = 10^3 ms = 10^6 μs = 10^9 ns = 10^12 ps = 10^15 fs
Java 中所有时间类,底层存储都是毫秒值: 从 1970 年 1 月 1 日 00:00:00(UTC)到当前时间的总毫秒数。
二、Date 时间类 📅
1. 概述
java.util.Date,必须导包- 表示一个瞬间,精确到毫秒
- 可以看做是 Java 写好的时间 JavaBean
2. 构造方法
| 方法名 | 说明 |
|---|---|
public Date() | 创建对象,表示当前系统时间 |
public Date(long date) | 创建对象,表示指定毫秒值对应的时间 |
3. 成员方法
| 方法名 | 说明 |
|---|---|
public void setTime(long time) | 设置/修改时间毫秒值 |
public long getTime() | 获取时间对象对应的毫秒值 |
4. 代码示例
import java.util.Date;
public class DateDemo01 {
public static void main(String[] args) {
// 1. 获取当前时间
Date d1 = new Date();
System.out.println(d1);
// 2. 指定时间:1970-01-01 00:00:00
Date d2 = new Date(0L);
System.out.println(d2);
// 东八区会显示 08:00:00
// 3. 修改时间 d2.setTime(1000L); // 加 1 秒
d2.setTime(1000L);
System.out.println(d2);
// 4. 获取毫秒值
long time = d2.getTime();
System.out.println(time); // 1000
}
}
✨ 小细节: 中国属于东八区,比标准时间快 8 小时,所以 0 毫秒值会显示
08:00:00。
三、SimpleDateFormat 格式化与解析 ✍️
1. 作用
- 格式化:Date 对象 → 好看的字符串(如
2026-02-10 12:00:00) - 解析:字符串时间 → Date 对象
2. 包路径
java.text.SimpleDateFormat
3. 构造方法
| 方法名 | 说明 |
|---|---|
public SimpleDateFormat() | 默认格式 |
public SimpleDateFormat(String pattern) | 指定格式(最常用) |
4. 核心方法
| 方法名 | 说明 |
|---|---|
String format(Date date) | 格式化:日期 → 字符串 |
Date parse(String source) | 解析:字符串 → 日期 |
5. 日期模式字母
| 字母 | 含义 |
|---|---|
| y | 年 |
| M | 月 |
| d | 日 |
| H | 时(24 小时制) |
| m | 分 |
| s | 秒 |
| S | 毫秒 |
常用格式:
yyyy-MM-dd HH:mm:ss yyyy 年 MM 月 dd 日 HH:mm:ss
6. 代码示例
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo01 {
public static void main(String[] args) throws ParseException {
Date d = new Date(0L);
// 1. 默认格式
SimpleDateFormat sdf1 = new SimpleDateFormat();
System.out.println(sdf1.format(d));
// 2. 自定义格式
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH:mm:ss");
System.out.println(sdf2.format(d));
// 3. 字符串解析成 Date
String str = "2023-11-11 11:11:11";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(str);
System.out.println(date.getTime());
}
}
⚠️ 注意:
parse方法会抛出 ParseException,必须处理(throws / try-catch)。
四、Calendar 日历类 📆
1. 概述
java.util.Calendar- 抽象类,不能直接 new,通过
getInstance()获取对象 - 可以单独获取/修改:年、月、日、时、分、秒、星期
2. 获取对象
Calendar c = Calendar.getInstance();
底层会根据系统时区、语言返回不同的子类对象。
3. 常用方法
| 方法名 | 说明 |
|---|---|
int get(int field) | 获取某个字段 |
void set(int field, int value) | 修改某个字段 |
void add(int field, int amount) | 增加/减少时间 |
Date getTime() | 转成 Date 对象 |
long getTimeInMillis() | 获取时间毫秒值 |
4. 日历常用字段(背)
Calendar.YEAR:年Calendar.MONTH:月(0~11,不是 1~12)Calendar.DAY_OF_MONTH:日Calendar.DAY_OF_WEEK:星期(周日为 1,周一 2…周六 7)
5. 代码示例
import java.util.Calendar;
import java.util.Date;
public class CalendarDemo01 {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
// 设置年月日 c.set(2026,8,10); // 月份减 1
c.add(Calendar.MONTH, -1);
// 获取
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1; // +1 才是真实月份
int day = c.get(Calendar.DAY_OF_MONTH);
int weekIndex = c.get(Calendar.DAY_OF_WEEK);
System.out.println(year + "年" + month + "月" + day + "日 " + getWeek(weekIndex));
}
// 星期转换
public static String getWeek(int index) {
String[] arr = {"", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
return arr[index];
}
}
⚠️ 超级大坑: 月份:0 代表 1 月,11 代表 12 月 星期:1 是周日,2 是周一,7 是周六 实际开发一定要做转换!
📌 本篇知识回顾
- Java 时间底层都是毫秒值,从 1970-1-1 开始算
- Date:表示时间,获取/设置毫秒值
- SimpleDateFormat:格式化 & 解析,掌握
yyyy-MM-dd HH:mm:ss - Calendar:抽象类,通过
getInstance()获取- 月份 0~11
- 星期 1=周日
✍️ 写在最后
本篇我们系统学完了 JDK7 及以前的传统时间类,它们虽然好用,但存在线程不安全、设计不优雅等问题,所以 JDK8 推出了全新的时间 API。
下一篇我们将学习: JDK8 全新时间类:LocalDate、LocalTime、LocalDateTime、Instant、DateTimeFormatter 等,更加简洁、安全、强大!


