Java 日期时间类型详解
Java 提供了多种处理日期和时间的类,主要分为旧版 API 和新版 API。

旧版日期时间 API (Java 8 之前)
-
java.util.Date- 表示特定的时间点,精确到毫秒
- 包含日期和时间信息
- 大部分方法已废弃
-
java.util.Calendar- 抽象类,提供了操作日期字段的方法
- 常用实现类是
GregorianCalendar - 可以获取和设置年、月、日等字段
-
java.text.SimpleDateFormat- 用于日期和字符串之间的格式化和解析
- 线程不安全
新版日期时间 API (Java 8 及之后)
Java 8 引入了全新的日期时间 API (java.time 包),解决了旧版 API 的许多问题。

核心类
-
LocalDate- 表示不带时间的日期 (如 2025-05-15)
- 不可变且线程安全
-
LocalTime- 表示不带日期的时间 (如 15:30:45)
- 不可变且线程安全
-
LocalDateTime- 表示日期和时间 (如 2025-05-15T15:30:45)
- 不可变且线程安全
-
ZonedDateTime- 带时区的日期时间
- 不可变且线程安全
-
Instant- 表示时间线上的一个瞬时点
- 通常用于机器时间交互
-
Duration- 表示两个时间点之间的时间量
- 精确到纳秒
-
Period表示两个日期之间的天数、月数和年数
格式化类
DateTimeFormatter- 替代了旧的
SimpleDateFormat - 线程安全
- 提供预定义的格式和自定义格式
- 替代了旧的
示例代码
import java.time.*;
import java.time.format.DateTimeFormatter;
public class DateTimeExample {
public static void main(String[] args) {
// 获取当前日期时间
LocalDateTime now = LocalDateTime.now();
System.out.println("当前日期时间: " + now);
// 格式化日期时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = now.format(formatter);
System.out.println("格式化后的日期时间: " + formattedDateTime);
// 创建特定日期
LocalDate date = LocalDate.of(2025, 5, 15);
System.out.println("特定日期: " + date);
// 时间计算
LocalDate tomorrow = date.plusDays(1);
System.out.println("明天: " + tomorrow);
// 时区处理
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
System.out.println("上海时区时间: " + zonedDateTime);
}
}
最佳实践
- 优先使用 Java 8 的
java.timeAPI - 避免使用
Date和Calendar类 - 使用
DateTimeFormatter进行日期时间格式化 - 对于需要线程安全的场景,确保使用不可变的日期时间类
Java 8 的日期时间 API 设计更加清晰、不可变且线程安全,是处理日期时间操作的首选。
