java.util.Date 是 Java 中用于表示特定瞬间的类,精确到毫秒级别。它是 Java 早期处理日期时间的基础类,尽管在 JDK 1.8 之后被 java.time 包中的新 API(如 LocalDateTime、Instant 等)取代,但在旧项目的代码中任然广泛存在。
Date 类的核心作用是存储一个时间戳,即从 1970 年 1 月 1 日 00:00:00 GMT( epoch 时间)开始经过的毫秒数,以此表示一个具体的时间点。
什么是 epoch 时间?
Epoch 时间(也称为 “时间戳”)是计算机领域中表示时间的一种标准方式,指从1970 年 1 月 1 日 00:00:00 UTC(协调世界时) 开始所经过的秒数(或毫秒数等,依精度而定)。
它的作用是将时间统一为一个连续的数字,方便计算机存储和计算,避免了时区、历法格式等带来的复杂性。例如,代码中date.getTime()返回的就是自 epoch 时刻起的毫秒数,而Instant.ofEpochMilli()则通过这个毫秒数创建对应的时间对象。
下面示例将演示 Date 类各种方法的用法:
import java.util.Date;
public class DateExample {
public static void main(String[] args) {
// 1. 创建Date对象的几种方式
// 创建表示当前时间的Date对象
Date currentDate = new Date();
System.out.println("当前时间: " + currentDate);
// 通过毫秒数创建Date对象(从1970年1月1日00:00:00 GMT开始计算)
long milliseconds = 1620000000000L; // 2021年5月3日左右
Date specificDate = new Date(milliseconds);
System.out.println("指定毫秒数对应的时间: " + specificDate);
// 2. getTime()方法:获取自1970年1月1日00:00:00 GMT以来的毫秒数
long currentTimeMillis = currentDate.getTime();
System.out.println("当前时间的毫秒数: " + currentTimeMillis);
// 3. setTime()方法:设置此Date对象表示的时间点
Date anotherDate = new Date();
anotherDate.setTime(milliseconds); // 设置为与specificDate相同的时间
System.out.println("设置后的时间: " + anotherDate);
// 4. 比较两个Date对象的方法
// after():测试此日期是否在指定日期之后
boolean isAfter = currentDate.after(specificDate);
System.out.println("当前时间是否在指定时间之后: " + isAfter);
// before():测试此日期是否在指定日期之前
boolean isBefore = currentDate.before(specificDate);
System.out.println("当前时间是否在指定时间之前: " + isBefore);
// compareTo():比较两个日期
// 返回值:0表示相等,正数表示此日期在指定日期之后,负数表示此日期在指定日期之前
int comparison = currentDate.compareTo(specificDate);
System.out.println("比较结果(currentDate 与 specificDate): " + comparison);
// equals():检查两个日期是否表示同一个时间点
boolean isEqual = currentDate.equals(specificDate);
System.out.println("两个日期是否相等: " + isEqual);
// 5. toString()方法:将此Date对象转换为字符串表示
// 注:toString()方法的输出格式是固定的,如:Wed Aug 28 15:30:45 CST 2024
String dateString = currentDate.toString();
System.out.println("Date对象的字符串表示: " + dateString);
}
}运行结果:
当前时间: Fri Aug 29 09:44:34 UTC 2025 指定毫秒数对应的时间: Mon May 03 00:00:00 UTC 2021 当前时间的毫秒数: 1756460674053 设置后的时间: Mon May 03 00:00:00 UTC 2021 当前时间是否在指定时间之后: true 当前时间是否在指定时间之前: false 比较结果(currentDate 与 specificDate): 1 两个日期是否相等: false Date对象的字符串表示: Fri Aug 29 09:44:34 UTC 2025
返回该 Date 对象表示的时间戳(毫秒数)。示例:
import java.util.Date;
public class DateExample {
public static void main(String[] args) {
Date date = new Date(); // 获取当前时间
long timestamp = date.getTime();
System.out.println("当前时间戳(毫秒):" + timestamp);
}
}运行结果:
当前时间戳(毫秒):1756460072933
设置 Date 对象的时间戳,参数为从 1970 年 1 月 1 日 00:00:00 GMT开始的毫秒数。示例:
import java.util.Date;
public class DateExample {
public static void main(String[] args) {
Date date = new Date();
// 设置时间为 epoch 后 1 秒(1000毫秒)
date.setTime(1000);
System.out.println("设置后的时间:" + date); // 输出:Thu Jan 01 08:00:01 CST 1970
}
}运行结果:
设置后的时间:Thu Jan 01 00:00:01 UTC 1970
判断当前 Date 对象是否在参数 when 表示的时间之后,返回 boolean。示例:
import java.util.Date;
public class DateExample {
public static void main(String[] args) {
Date now = new Date();
Date past = new Date(now.getTime() - 3600 * 1000); // 1小时前
boolean isAfter = now.after(past);
System.out.println("当前时间在过去时间之后?" + isAfter); // 输出:true
}
}运行结果:
当前时间在过去时间之后?true
判断当前 Date 对象是否在参数 when 表示的时间之前,返回 boolean。示例:
import java.util.Date;
public class DateExample {
public static void main(String[] args) {
Date now = new Date();
Date future = new Date(now.getTime() + 3600 * 1000); // 1小时后
boolean isBefore = now.before(future);
System.out.println("当前时间在未来时间之前?" + isBefore); // 输出:true
}
}运行结果:
当前时间在未来时间之前?true
Date 类中通过 getMonth() 获取的月份范围是 0~11(0 代表 1 月,11 代表 12 月),容易导致混淆。
Date date = new Date(2023 - 1900, 1, 1); // 实际表示 2023年2月1日(而非1月)
getYear() 返回的是相对于 1900 年的偏移量,需加 1900 才是实际年份。
Date date = new Date(); int year = date.getYear() + 1900; // 正确获取年份
Date 类的 setter 方法(如 setTime())没有同步处理,多线程环境下可能导致数据不一致。
Date 本质是一个时间戳,不直接关联时区信息,时区转换需依赖 Calendar 或 SimpleDateFormat,使用复杂。
java.util.Date 虽然是 Java 早期的日期时间类,但因设计缺陷较多,建议在新代码中使用 java.time 包(JDK 1.8+),如 Instant(对应时间戳)、LocalDateTime(本地日期时间)等,这些类线程安全且 API 设计更合理。