Java 时间类型介绍与转换指南
Java 提供了多种时间处理类,主要分为两类:
- 传统日期时间类(
java.util包) - 现代日期时间API(
java.time包,Java 8+推荐使用)
一、主要时间类型
-
java.util.Date- 表示特定的时间点(精确到毫秒)
- 缺点:时区处理不便,API设计过时
-
java.util.Calendar- 提供日期计算功能
- 缺点:月份从0开始(0=1月),线程不安全
-
java.time.LocalDate(Java 8+)- 仅包含日期(年-月-日)
- 示例:
2023-10-15
-
java.time.LocalTime(Java 8+)- 仅包含时间(时:分:秒)
- 示例:
14:30:45
-
java.time.LocalDateTime(Java 8+)- 包含日期和时间
- 示例:
2023-10-15T14:30:45
-
java.time.ZonedDateTime(Java 8+)- 带时区的完整日期时间
- 示例:
2023-10-15T14:30:45+08:00[Asia/Shanghai]
-
java.time.Instant(Java 8+)- 时间戳(UTC时区)
- 示例:
2023-10-15T06:30:45Z
二、类型转换代码示例
import java.time.*;
import java.util.*;
public class TimeConversionDemo {
public static void main(String[] args) {
// 1. 传统类型互转
Date utilDate = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(utilDate); // Date → Calendar
// 2. 现代API互转
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.of(date, time); // LocalDate+LocalTime → LocalDateTime
// 3. 传统 → 现代 (Java 8+)
Instant instant = utilDate.toInstant(); // Date → Instant
ZonedDateTime zonedDT = ZonedDateTime.ofInstant(instant, ZoneId.systemDefault());
// 4. 现代 → 传统
Date newDate = Date.from(instant); // Instant → Date
// 5. 带时区转换
ZonedDateTime londonTime = ZonedDateTime.now(ZoneId.of("Europe/London"));
LocalDateTime localDT = londonTime.toLocalDateTime(); // 时区时间 → 本地时间
// 6. 字符串解析
LocalDateTime parsedDT = LocalDateTime.parse("2023-12-25T08:30:00");
// 7. 格式化输出
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
String formatted = dateTime.format(formatter); // 输出示例: 2023/10/15 14:30
}
}
三、转换关系图
四、最佳实践建议
- 优先使用
java.time包(Java 8+) - 时区处理:
// 明确指定时区 ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("GMT+8")); - 时间差计算:
Duration duration = Duration.between(startTime, endTime); long minutes = duration.toMinutes(); - 日期运算:
LocalDate nextWeek = LocalDate.now().plusDays(7);
五、注意事项
SimpleDateFormat线程不安全,推荐使用DateTimeFormatter- 避免混用新旧API,必要转换时使用
Instant作为桥梁 - 数据库交互:
- JDBC 4.2+ 支持直接使用
java.time类型 - 旧驱动需转换:
Timestamp timestamp = Timestamp.valueOf(localDateTime);
- JDBC 4.2+ 支持直接使用

被折叠的 条评论
为什么被折叠?



