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

【已开源】【嵌入式 Linux 音视频+ AI 实战项目】瑞芯微 Rockchip 系列 RK3588-基于深度学习的人脸门禁+ IPC 智能安防监控系统

【已开源】【嵌入式 Linux 音视频+ AI 实战项目】瑞芯微 Rockchip 系列 RK3588-基于深度学习的人脸门禁+ IPC 智能安防监控系统

前言 本文主要介绍我最近开发的一个个人实战项目,“基于深度学习的人脸门禁+ IPC 智能安防监控系统”,全程满帧流畅运行。这个项目我目前全网搜了一圈,还没发现有相关类型的开源项目。这个项目只要稍微改进下,就可以变成市面上目前流行的三款产品,人脸识别门禁系统、IPC 安防和 NVR。在最下面会有视频演示。 本项目适用于瑞芯微 Rockchip 系列的板端,开源链接在文章最下面。 功能 人脸门禁系统 * 人靠近自动亮屏,人走自动息屏 * 支持人脸识别 * 支持录入人脸,并进行人脸配对(极速配对 < 0.2S) IPC 智能安防监控系统 * 支持通过 onvif 实时查看摄像头画面 * 支持实时目标检测(支持高达80种物体检测) * 支持录像 * 支持检测到人时自动录像 * 支持检测到人时自动报警 用到的硬件 * 野火鲁班猫4 RK3588S2 * IMX415 800W 4k 摄像头 * RTL8822CE Wifi+BT

By Ne0inhk

揭秘Docker容器中Git工作树隔离难题:3步实现代码管理零冲突

第一章:揭秘Docker容器中Git工作树隔离难题 在使用 Docker 构建开发环境时,开发者常将本地 Git 仓库挂载到容器中以实现代码实时同步。然而,这种操作可能引发 Git 工作树被意外修改或无法识别的问题,导致版本控制异常。 问题根源分析 当宿主机与容器共享同一个 Git 目录时,若容器内运行的进程(如构建脚本、IDE 插件)自动执行了 Git 操作,可能会改变 .git 目录状态。此外,不同系统对文件权限、换行符的处理差异,也会使 Git 误判文件变更。 * 容器内 UID 与宿主机不一致,导致 .git 配置文件权限冲突 * 跨平台开发中 CRLF 与 LF 换行符转换引发“所有文件被修改”假象 * 容器内后台进程(如 linter)触发

By Ne0inhk
配置 GitHub 双重身份验证(2FA)教程

配置 GitHub 双重身份验证(2FA)教程

在现代的互联网安全环境中,双重身份验证(2FA)已成为保护账户安全的重要手段。GitHub 作为全球最大的软件开发平台之一,提供了双重身份验证功能,增加了账户的安全性,防止密码泄露或被暴力破解等攻击方式。本文将详细介绍如何配置 GitHub 的 2FA。 1. 登录 GitHub 账户 首先,打开 GitHub 官网,使用你的用户名和密码登录到 GitHub。 2. 访问设置页面 在左侧菜单中,选择 Security(安全性)选项。 登录后,点击右上角的头像,进入 Settings(设置)页面。 3. 启用双重身份验证 1. 点击 Enable two-factor authentication(启用双重身份验证)按钮。 在 Security 页面下,找到 Two-factor

By Ne0inhk
使用 VS Code 将项目代码上传到 Gitee 的完整指南

使用 VS Code 将项目代码上传到 Gitee 的完整指南

在现代软件开发流程中,版本控制是不可或缺的一环。 Gitee(码云)作为国内领先的代码托管平台,为开发者提供了稳定、快速的 Git 服务。 本文将详细介绍如何使用 Visual Studio Code(VS Code)将本地项目代码上传至 Gitee 仓库,涵盖从环境配置、初始化仓库到推送代码的完整流程。 一、准备工作 1. 安装必要工具 * Git:确保你的系统已安装 Git。 可通过终端运行 git --version  或 git -v 验证是否安装成功。 * VS Code:下载并安装 Visual Studio Code。 * Gitee 账号:前往 Gitee 官网 注册账号(如尚未注册)。 2. 安装 VS

By Ne0inhk