java.util.Date 类

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

常用方法

getTime()

返回该 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


setTime(long time)

设置 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


after(Date when)

判断当前 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


before(Date when)

判断当前 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

 

缺陷及问题

月份从 0 开始

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 设计更合理。

 

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号