最推荐使用Instant.now().toEpochMilli()获取时间戳,1. System.currentTimeMillis()高效简单;2. Date().getTime()已过时;3. Instant支持纳秒且线程安全;4. LocalDateTime需结合时区转换。

在 Java 中获取当前时间戳有多种方式,适用于不同的场景和需求。以下是几种常用的方法,涵盖从传统到现代的时间处理方式。
使用 System.currentTimeMillis()
这是最简单、最常见的获取时间戳的方式,返回自 1970 年 1 月 1 日 00:00:00 UTC 起的毫秒数。示例代码:
立即学习“Java免费学习笔记(深入)”;
long timestamp = System.currentTimeMillis();
System.out.println("当前时间戳(毫秒): " + timestamp);
这种方式效率高,适合大多数需要时间戳的场景,比如日志记录、性能监控等。
使用 java.util.Date
通过创建 Date 对象并调用 getTime() 方法也可以获取时间戳。示例代码:
立即学习“Java免费学习笔记(深入)”;
import java.util.Date;
Date date = new Date();
long timestamp = date.getTime();
System.out.println("当前时间戳(毫秒): " + timestamp);
虽然功能正常,但 Date 类已被认为是过时的,建议优先使用更现代的 API。
使用 java.time.Instant(Java 8+ 推荐)
Instant 是 Java 8 引入的现代化时间 API,表示时间线上的一个瞬时点,默认基于 UTC 时区。示例代码:
立即学习“Java免费学习笔记(深入)”;
import java.time.Instant;
Instant now = Instant.now();
long timestamp = now.toEpochMilli(); // 毫秒
long secondTimestamp = now.getEpochSecond(); // 秒
System.out.println("毫秒时间戳: " + timestamp);
System.out.println("秒级时间戳: " + secondTimestamp);
推荐在新项目中使用 Instant,它线程安全且 API 更清晰。
使用 LocalDateTime 和 ZoneOffset
如果你需要结合本地时间处理时间戳,可以配合 ZoneOffset 使用。示例代码:
立即学习“Java免费学习笔记(深入)”;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
LocalDateTime now = LocalDateTime.now();
long timestamp = now.toEpochSecond(ZoneOffset.UTC);
System.out.println("秒级时间戳: " + timestamp);
注意:toEpochSecond 需要指定时区偏移,否则无法转换。
总结对比
- System.currentTimeMillis():最直接,性能好,适合简单场景。
- Date.getTime():可用但不推荐,API 设计较老。
- Instant.now().toEpochMilli():现代 Java 推荐方式,功能丰富,支持纳秒精度。
- LocalDateTime.toEpochSecond():适合需要本地时间逻辑的场景,需手动处理时区。











