Java 时间类(上):JDK7 及以前时间类 Date、SimpleDateFormat、Calendar 最全总结
🏠个人主页:黎雁
🎬作者简介:C/C++/JAVA后端开发学习者
❄️个人专栏:C语言、数据结构(C语言)、EasyX、JAVA、游戏、规划、程序人生
✨ 从来绝巘须孤往,万里同尘即玉京
文章目录
Java 时间类(上):JDK7 及以前时间类 Date、SimpleDateFormat、Calendar 最全总结 🕒
本文适合 Java 初学者、准备面试、需要系统梳理时间 API 的同学,内容超详细,建议收藏反复看~
📝 文章摘要
- 阅读时长: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 \mu 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. 代码示例
importjava.util.Date;publicclassDateDemo01{publicstaticvoidmain(String[] args){// 1. 获取当前时间Date d1 =newDate();System.out.println(d1);// 2. 指定时间:1970-01-01 00:00:00Date d2 =newDate(0L);System.out.println(d2);// 东八区会显示 08:00:00// 3. 修改时间 d2.setTime(1000L);// 加 1 秒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. 代码示例
importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassSimpleDateFormatDemo01{publicstaticvoidmain(String[] args)throwsParseException{Date d =newDate(0L);// 1. 默认格式SimpleDateFormat sdf1 =newSimpleDateFormat();System.out.println(sdf1.format(d));// 2. 自定义格式SimpleDateFormat sdf2 =newSimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");System.out.println(sdf2.format(d));// 3. 字符串解析成 DateString str ="2023-11-11 11:11:11";SimpleDateFormat sdf =newSimpleDateFormat("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. 代码示例
importjava.util.Calendar;importjava.util.Date;publicclassCalendarDemo01{publicstaticvoidmain(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));}// 星期转换publicstaticStringgetWeek(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 等,更加简洁、安全、强大!
如果你觉得本文对你有帮助,欢迎 点赞 👍、收藏 💾、评论 💬,后续持续更新 Java 基础精讲系列~