Java 时间类(上):JDK7 及以前时间类 Date、SimpleDateFormat、Calendar 最全总结

Java 时间类(上):JDK7 及以前时间类 Date、SimpleDateFormat、Calendar 最全总结
在这里插入图片描述
🏠个人主页:黎雁
🎬作者简介:C/C++/JAVA后端开发学习者
❄️个人专栏:C语言数据结构(C语言)EasyXJAVA游戏规划程序人生
✨ 从来绝巘须孤往,万里同尘即玉京
在这里插入图片描述


文章目录

在这里插入图片描述

Java 时间类(上):JDK7 及以前时间类 Date、SimpleDateFormat、Calendar 最全总结 🕒

本文适合 Java 初学者、准备面试、需要系统梳理时间 API 的同学,内容超详细,建议收藏反复看~

📝 文章摘要

  • 阅读时长:10 分钟
  • 适合人群
    1. Java 零基础小白 → 重点看:概念、构造方法、代码示例
    2. 正在学习 Java 常用类的同学 → 重点看:格式转换、日历字段、易错点
    3. 面试复习 → 重点看:月份从 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 是周六
实际开发一定要做转换

📌 本篇知识回顾

  1. Java 时间底层都是毫秒值,从 1970-1-1 开始算
  2. Date:表示时间,获取/设置毫秒值
  3. SimpleDateFormat:格式化 & 解析,掌握 yyyy-MM-dd HH:mm:ss
  4. Calendar:抽象类,通过 getInstance() 获取
    • 月份 0~11
    • 星期 1=周日

✍️ 写在最后

本篇我们系统学完了 JDK7 及以前的传统时间类,它们虽然好用,但存在线程不安全、设计不优雅等问题,所以 JDK8 推出了全新的时间 API。

下一篇我们将学习:
JDK8 全新时间类:LocalDate、LocalTime、LocalDateTime、Instant、DateTimeFormatter 等,更加简洁、安全、强大!

如果你觉得本文对你有帮助,欢迎 点赞 👍、收藏 💾、评论 💬,后续持续更新 Java 基础精讲系列~

Read more

C++ 模板进阶:特化、萃取与可变参数模板

C++ 模板进阶:特化、萃取与可变参数模板

C++ 模板进阶:特化、萃取与可变参数模板 💡 学习目标:掌握模板进阶技术的核心用法,理解模板特化的深层应用、类型萃取的实现原理,以及可变参数模板的灵活使用,提升泛型编程的实战能力。 💡 学习重点:模板特化的进阶场景、类型萃取工具的设计与应用、可变参数模板的展开技巧、折叠表达式的使用方法。 一、模板特化进阶:处理复杂类型场景 💡 模板特化不只是针对单一类型的定制,还能处理指针、引用、数组等复杂类型,实现更精细的类型适配逻辑。 1.1 指针类型的模板特化 通用模板默认处理普通类型,我们可以为指针类型单独编写特化版本,实现指针专属的逻辑。 #include<iostream>#include<string>usingnamespace std;// 通用模板:处理普通类型template<typenameT>classTypeProcessor{public:staticvoidprocess(T data){ cout

By Ne0inhk

C++ 设计模式概述及常用模式

C++ 设计模式概述 本文介绍了C++中23种设计模式的分类及实现示例,主要分为三大类: 创建型模式(5个):单例模式(常用)、工厂方法模式(常用)、抽象工厂模式(常用)、建造者模式和原型模式。这些模式专注于对象的创建机制。 结构型模式(7个):适配器模式(常用)、桥接模式、组合模式和装饰器模式(常用)等。这些模式处理类和对象的组合方式。 行为型模式:未完整列出,但包含观察者模式等(未展示完整代码)。 文章通过简洁的C++代码示例展示了常用设计模式的实现方法,如单例模式通过私有构造函数和静态方法确保唯一实例,工厂方法模式通过抽象工厂类创建产品等。这些模式为解决特定设计问题提供了可重用的解决方案。 C++ 设计模式概述及常用模式 设计模式可分为三大类:创建型、结构型、行为型。以下是23个设计模式的分类及代码示例: 一、创建型模式(5个) 1. 单例模式(Singleton)⭐ 常用 classSingleton{private:static

By Ne0inhk
C++测试与调试:确保代码质量与稳定性

C++测试与调试:确保代码质量与稳定性

C++测试与调试:确保代码质量与稳定性 一、学习目标与重点 本章将深入探讨C++测试与调试的核心知识,帮助你确保代码的质量与稳定性。通过学习,你将能够: 1. 理解测试与调试的基本概念,掌握测试方法和工具 2. 学会使用单元测试框架,如Google Test和Catch2 3. 理解集成测试的重要性,确保系统的功能正确性 4. 学会使用调试工具,如GDB和Visual Studio调试器 5. 培养测试与调试思维,设计高质量的代码 二、测试的基本概念 2.1 测试的分类 测试可以分为以下几类: * 单元测试:测试单个函数或类的功能 * 集成测试:测试多个模块的集成功能 * 系统测试:测试整个系统的功能 * 验收测试:测试系统是否满足用户需求 * 性能测试:测试系统的性能指标 2.2 测试原则 测试应该遵循以下原则: * 测试应该尽可能早地进行 * 测试应该覆盖所有可能的场景 * 测试应该是自动化的

By Ne0inhk

Java + Vue 毕业设计选题效率提升指南:从脚手架到自动化部署的全链路优化

毕业设计季又到了,对于计算机专业的同学来说,用 Java 做后端,Vue 做前端,是一个非常经典且实用的技术栈组合。但很多同学在真正动手时,常常被各种“琐事”绊住,比如环境配半天、前后端接口对不上、部署时手忙脚乱,导致宝贵的开发时间被大量浪费。今天,我就结合自己带学弟学妹做毕设的经验,聊聊如何通过一套标准化的流程和工具,把 Java + Vue 毕设的开发效率提上去,让你把精力真正花在业务逻辑和创新点上。 1. 毕业设计效率痛点:我们到底在哪儿“卡”住了? 在开始技术选型之前,我们先得搞清楚,做 Java + Vue 毕设时,哪些环节最容易“掉链子”。根据我的观察,主要有这么几个: 1. 环境配置地狱:这是第一个拦路虎。A 同学的 MySQL 是 8.0,B 同学是

By Ne0inhk