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

使用 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.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.Date和java.util.Calendar。
