Date 与 SimpleDateFormat 

摘要

  • Date 类用于表示特定瞬间的时间(精确到毫秒),核心处理时间戳与日期比较;
  • SimpleDateFormat 类是 Date 类的 “格式化工具”,用于 Date 对象与字符串的相互转换(支持自定义格式);
  • 两者配合实现日期的存储、展示与解析,但需注意:Date 类多数分量操作方法已过时,SimpleDateFormat 存在线程不安全问题,Java 8 + 推荐用java.time包替代。

一、Date 类常用方法

1. 构造方法

返回值类型方法名核心功能
DateDate()创建表示当前系统时间的 Date 对象(精确到毫秒)
DateDate(long date)根据时间戳(1970-01-01 00:00:00 GMT 起的毫秒数)创建 Date 对象

2. 时间戳操作

返回值类型方法名核心功能
longgetTime()获取 Date 对象对应的时间戳(毫秒数)
voidsetTime(long time)设置 Date 对象的时间戳(修改表示的时间)

3. 日期比较

返回值类型方法名核心功能
booleanbefore(Date when)判断当前 Date 是否在指定 Date 之前
booleanafter(Date when)判断当前 Date 是否在指定 Date 之后
intcompareTo(Date anotherDate)比较两个 Date:0 = 相等,负数 = 当前更早,正数 = 当前更晚
booleanequals(Object obj)判断两个 Date 是否表示同一时间(时间戳相等)

4. 过时方法(旧代码使用)

返回值类型方法名核心功能
intgetYear()获取年份(返回值 = 实际年份 - 1900,已过时)
intgetMonth()获取月份(0=1 月,11=12 月,已过时)
intgetDate()获取当月日期(1~31,已过时)
intgetHours()获取小时(0~23,已过时)
intgetMinutes()获取分钟(0~59,已过时)
intgetSeconds()获取秒数(0~59,已过时)

二、SimpleDateFormat 类常用方法

1. 构造方法

返回值类型方法名核心功能
SimpleDateFormatSimpleDateFormat(String pattern)根据自定义格式创建格式化对象(如 "yyyy-MM-dd HH:mm:ss")
SimpleDateFormatSimpleDateFormat(String pattern, Locale locale)按指定语言环境创建格式化对象(解决国际化日期格式)

2. 格式化与解析

返回值类型方法名核心功能
Stringformat(Date date)将 Date 对象格式化为指定格式的字符串
Dateparse(String source)将字符串按指定格式解析为 Date 对象(需处理 ParseException)

3. 格式与时区设置

返回值类型方法名核心功能
voidapplyPattern(String pattern)修改日期格式模式(如从 "yyyy-MM-dd" 改为 "yyyy/MM/dd")
voidsetTimeZone(TimeZone zone)设置时区(如 TimeZone.getTimeZone ("GMT+8"))
StringtoPattern()获取当前使用的格式模式字符串
TimeZonegetTimeZone()获取当前设置的时区

三、Date 与 SimpleDateFormat  代码示例

Date 日期类示例

import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.util.Locale;
import java.text.ParseException;

// ========== Date类示例 ==========
// 1. 构造方法
Date date1 = new Date(); // 创建当前系统时间的Date对象
System.out.println("Date()构造:" + date1); // 输出当前时间默认格式,示例:Wed Nov 26 16:30:00 CST 2025
Date date2 = new Date(1764123456789L); // 按时间戳创建Date对象
System.out.println("Date(long)构造:" + date2); // 输出指定时间戳的时间,示例:Sat Aug 31 12:17:36 CST 2025

// 2. 时间戳操作
long timestamp = date1.getTime(); // 获取Date对象的时间戳
System.out.println("getTime()获取时间戳:" + timestamp); // 输出当前时间戳(毫秒),示例:1764124200000
date1.setTime(1764123456789L); // 设置新的时间戳
System.out.println("setTime()修改后:" + date1); // 输出修改后的时间,示例:Sat Aug 31 12:17:36 CST 2025

// 3. 日期比较
Date date3 = new Date(1764123000000L);
Date date4 = new Date(1764123456789L);
boolean isBefore = date3.before(date4); // 判断date3是否在date4之前
System.out.println("before():" + isBefore); // 输出:true
boolean isAfter = date3.after(date4); // 判断date3是否在date4之后
System.out.println("after():" + isAfter); // 输出:false
int compareResult = date3.compareTo(date4); // 比较两个Date对象
System.out.println("compareTo():" + compareResult); // 输出:-1(date3更早)
boolean isEqual = date3.equals(date4); // 判断是否为同一时间
System.out.println("equals():" + isEqual); // 输出:false

// 4. 过时方法
int year = date1.getYear() + 1900; // 获取年份(需+1900修正)
System.out.println("getYear():" + year); // 输出:2025
int month = date1.getMonth() + 1; // 获取月份(需+1修正)
System.out.println("getMonth():" + month); // 输出:8
int day = date1.getDate(); // 获取当月日期
System.out.println("getDate():" + day); // 输出:31
int hour = date1.getHours(); // 获取小时
System.out.println("getHours():" + hour); // 输出:12
int minute = date1.getMinutes(); // 获取分钟
System.out.println("getMinutes():" + minute); // 输出:17
int second = date1.getSeconds(); // 获取秒数
System.out.println("getSeconds():" + second); // 输出:36

SimpleDateFormat  示例

// ========== SimpleDateFormat类示例 ==========
// 1. 构造方法
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 自定义格式构造
System.out.println("SimpleDateFormat(String)构造:" + sdf1.toPattern()); // 输出:yyyy-MM-dd HH:mm:ss
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日", Locale.CHINA); // 指定语言环境构造
System.out.println("SimpleDateFormat(String, Locale)构造:" + sdf2.toPattern()); // 输出:yyyy年MM月dd日

// 2. 格式化与解析
String formatStr = sdf1.format(date1); // Date对象格式化为字符串
System.out.println("format()格式化:" + formatStr); // 输出:2025-08-31 12:17:36
try {
    Date parseDate = sdf1.parse("2025-08-31 12:17:36"); // 字符串解析为Date对象
    System.out.println("parse()解析:" + parseDate); // 输出:Sat Aug 31 12:17:36 CST 2025
} catch (ParseException e) {
    e.printStackTrace();
}

// 3. 格式与时区设置
sdf1.applyPattern("yyyy/MM/dd"); // 修改格式模式
System.out.println("applyPattern()修改后模式:" + sdf1.toPattern()); // 输出:yyyy/MM/dd
sdf1.setTimeZone(TimeZone.getTimeZone("GMT")); // 设置GMT时区
System.out.println("setTimeZone()后时区:" + sdf1.getTimeZone().getID()); // 输出:GMT
String gmtFormat = sdf1.format(date1); // 按GMT时区格式化
System.out.println("GMT时区格式化:" + gmtFormat); // 输出:2025/08/31
TimeZone currentTZ = sdf1.getTimeZone(); // 获取当前时区
System.out.println("getTimeZone()获取时区:" + currentTZ.getID()); // 输出:GMT

总结

Date 类

  • 核心价值:处理时间戳和日期比较,是 Java 早期时间处理的基础类;
  • 局限性:日期分量操作(getYear () 等)已过时,不支持直接格式化,Java 8 + 推荐用Instant(时间戳)或LocalDateTime替代。

SimpleDateFormat 类

  • 核心价值:实现 Date 与字符串的灵活转换,支持自定义格式;
  • 风险点:线程不安全(多线程环境下需避免共用实例,或改用ThreadLocal包装);Java 8 + 推荐用DateTimeFormatter(线程安全)替代。

最佳实践

  • 新开发项目优先使用 Java 8 + 的java.time包(LocalDateTime、DateTimeFormatter、Instant);
  • 维护旧代码时,Date 与 SimpleDateFormat 配合使用需注意:SimpleDateFormat 避免多线程共享,解析字符串时捕获 ParseException,过时方法尽量用 Calendar 类替代。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐