杰瑞科技汇

java 获取当前时间date

在 Java 中获取当前时间有多种方式,以下是几种常见的方法,从旧版 API 到新版 API 的演进,并附上代码示例和说明。

java 获取当前时间date-图1
(图片来源网络,侵删)

使用 java.util.Date (旧版 API,不推荐用于新项目)

Date 类是 Java 最早用于表示日期和时间的类,它封装了自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。

特点:

  • 简单直接,可以快速获取当前时间。
  • 缺点:其设计有很多缺陷,例如年份是从 1900 开始的,月份是从 0 开始的,并且它不包含时区信息,导致在处理跨时区问题时非常棘手,在 Java 8 之后,官方已不推荐使用。

代码示例:

import java.util.Date;
public class CurrentDateExample {
    public static void main(String[] args) {
        // 创建一个表示当前时间的 Date 对象
        Date now = new Date();
        // 直接打印 Date 对象,会输出可读的日期时间字符串
        System.out.println("当前时间 (java.util.Date): " + now);
        // 获取当前时间的毫秒数 (自 1970-01-01 00:00:00 GMT 以来的毫秒数)
        long timestamp = now.getTime();
        System.out.println("时间戳 (毫秒): " + timestamp);
    }
}

输出示例:

java 获取当前时间date-图2
(图片来源网络,侵删)
当前时间 (java.util.Date): Wed Oct 26 10:30:55 CST 2025
时间戳 (毫秒): 1698310255987

使用 java.util.Calendar (旧版 API,作为 Date 的补充)

为了弥补 Date 类的不足,Java 引入了 Calendar 类,它提供了更丰富的日期和时间字段操作(如年、月、日、时、分、秒)。

特点:

  • Date 更灵活,可以方便地获取或修改日期的各个部分。
  • 缺点:API 相对繁琐,月份和年份的计算仍然容易出错(月份从0开始),线程不安全,且设计上比较复杂。

代码示例:

import java.util.Calendar;
public class CurrentCalendarExample {
    public static void main(String[] args) {
        // 获取一个 Calendar 实例,默认使用当前时间和默认时区
        Calendar calendar = Calendar.getInstance();
        // 获取年、月、日、时、分、秒
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1; // 月份从 0 开始,所以要 +1
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int hour = calendar.get(Calendar.HOUR_OF_DAY); // 24小时制
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
        System.out.println("当前时间 (java.util.Calendar):");
        System.out.printf("年: %d, 月: %d, 日: %d\n", year, month, day);
        System.out.printf("时: %d, 分: %d, 秒: %d\n", hour, minute, second);
    }
}

输出示例:

当前时间 (java.util.Calendar):
年: 2025, 月: 10, 日: 26
时: 10, 分: 31, 秒: 5

使用 java.time 包 (Java 8+ 推荐,现代 API)

自 Java 8 起,Java 引入了全新的 java.time 包,这是官方推荐的日期和时间处理 API,它解决了旧版 API 的所有主要问题,包括不可变性、线程安全和清晰的 API 设计。

java.time 包中包含几个核心类:

  • LocalDate: 表示仅包含日期(年、月、日),不包含时间。
  • LocalTime: 表示仅包含时间(时、分、秒、纳秒),不包含日期。
  • LocalDateTime: 表示日期和时间,但不包含时区信息。
  • ZonedDateTime: 表示带有时区的日期和时间。
  • Instant: 表示时间线上的一个瞬时点,类似于 Date 的时间戳,但更精确。

1 使用 LocalDateTime 获取当前日期和时间

这是最常用的方式,用于获取不带时区的当前日期和时间。

import java.time.LocalDateTime;
public class CurrentLocalDateTimeExample {
    public static void main(String[] args) {
        // 获取当前日期和时间,JVM 的默认时区
        LocalDateTime now = LocalDateTime.now();
        System.out.println("当前日期时间 (java.time.LocalDateTime): " + now);
        // 获取年、月、日、时、分、秒
        int year = now.getYear();
        int month = now.getMonthValue(); // getMonth() 返回 Month 枚举
        int day = now.getDayOfMonth();
        int hour = now.getHour();
        int minute = now.getMinute();
        int second = now.getSecond();
        System.out.println("解析后的日期时间:");
        System.out.printf("年: %d, 月: %d, 日: %d\n", year, month, day);
        System.out.printf("时: %d, 分: %d, 秒: %d\n", hour, minute, second);
    }
}

2 使用 ZonedDateTime 获取带时区的当前日期和时间

如果你的应用需要处理不同时区的时间,应该使用 ZonedDateTime

import java.time.ZonedDateTime;
import java.time.ZoneId;
public class CurrentZonedDateTimeExample {
    public static void main(String[] args) {
        // 获取 JVM 的默认时区
        ZoneId defaultZoneId = ZoneId.systemDefault();
        System.out.println("默认时区: " + defaultZoneId);
        // 获取当前日期和时间(带时区)
        ZonedDateTime now = ZonedDateTime.now();
        System.out.println("当前日期时间 (默认时区): " + now);
        // 获取指定时区的当前时间
        ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai");
        ZonedDateTime shanghaiTime = ZonedDateTime.now(shanghaiZoneId);
        System.out.println("上海当前时间: " + shanghaiTime);
        ZoneId newYorkZoneId = ZoneId.of("America/New_York");
        ZonedDateTime newYorkTime = ZonedDateTime.now(newYorkZoneId);
        System.out.println("纽约当前时间: " + newYorkTime);
    }
}

3 使用 Instant 获取当前时间戳

Instant 类非常适合用于记录事件发生的时间点或进行时间计算。

import java.time.Instant;
public class CurrentInstantExample {
    public static void main(String[] args) {
        // 获取当前时间戳(UTC 时区)
        Instant now = Instant.now();
        System.out.println("当前时间戳 (java.time.Instant): " + now);
        System.out.println("当前时间戳 (秒): " + now.getEpochSecond());
        System.out.println("当前时间戳 (毫秒): " + now.toEpochMilli());
    }
}

总结与推荐

方法 类/包 优点 缺点 推荐度
Date java.util 简单,直接获取时间戳 API 过时,设计有缺陷,无时区 ⭐☆☆☆☆ (不推荐)
Calendar java.util Date 功能更强 API 繁琐,线程不安全,设计复杂 ⭐☆☆☆☆ (不推荐)
LocalDateTime java.time API 清晰,线程安全,功能强大 不包含时区信息 ⭐⭐⭐⭐⭐ (推荐,用于本地时间)
ZonedDateTime java.time 功能最全面,支持时区 相对复杂 ⭐⭐⭐⭐⭐ (推荐,用于全局/跨时区时间)
Instant java.time 高精度时间戳,适合计算 不包含日期和时间格式 ⭐⭐⭐⭐⭐ (推荐,用于时间戳和计算)
  • 如果你正在使用 Java 8 或更高版本,请强烈推荐使用 java.time 包。
    • 如果只需要处理本地的日期和时间(不涉及跨时区),使用 LocalDateTime.now()
    • 如果需要处理不同时区的时间,使用 ZonedDateTime.now()
    • 如果只需要一个时间戳(毫秒/秒),使用 Instant.now()
  • 如果你维护的是旧版 Java (Java 8 之前) 项目,那么你只能使用 java.util.Datejava.util.Calendar
分享:
扫描分享到社交APP
上一篇
下一篇