Java日期时间类LocalDateTime和Date怎么互转?一文搞懂转换方法
作者:深色風信子
还在为Java日期时间类的转换发愁?本文详细讲解LocalDateTime、ZonedDateTime、OffsetDateTime与Date之间的互转方法,包含代码示例和对比分析,帮你轻松处理时区和时间格式问题
| 类名 | 包名 | 说明 |
|---|---|---|
| LocalDate | java.time | 无时间的日期 |
| LocalTime | java.time | 无日期的时间 |
| LocalDateTime | java.time | 无时区的日期时间 |
| ZonedDateTime | java.time | 带时区的日期时间 |
| OffsetDateTime | java.time | 带有偏移量的日期时间 |
| Instant | java.time | 时间戳 |
| Date | java.util | 旧的日期时间类,带有时区限制 |
| Calendar | java.util | 可操作日期时间,支持时区 |
| java.sql.Date | java.sql | 用于数据库的日期 |
| java.sql.Time | java.sql | 用于数据库的时间 |
| java.sql.Timestamp | ava.sql | 用于数据库的日期时间 |
| 特性 | LocalDateTime | ZonedDateTime | Date |
|---|---|---|---|
| 时区支持 | 不支持 | 支持 | 不支持 |
| 线程安全 | 是 | 是 | 否 |
| 推荐使用 | 是 | 是 | 否 |
| 用途 | 处理本地日期时间 | 处理跨时区日期时间 | 仅处理简单的时间戳 |
| API | 丰富、现代化的API | 丰富、现代化的API | 较为陈旧,需借助其他工具类 |
| 类型 | 特性 |
|---|---|
| LocalDateTime | LocalDateTime 是 java.time 包中的类,是 Java 8 引入的 java.time API(也叫 JSR 310)的一部分,用于表示没有时区的日期和时间。它结合了 LocalDate 和 LocalTime,仅处理日期和时间的本地表示,不考虑时区的差异。 |
| ZonedDateTime | ZonedDateTime 是另一个 Java 8 引入的类,它表示带有时区的日期和时间。与 LocalDateTime 不同,ZonedDateTime 包含完整的时区信息,能够处理不同地区之间的时间差异。 |
| Date | Date 是 Java 中最早用于处理日期和时间的类,来自 java.util 包。Date 类最初设计得比较简单,只能表示一个特定的时间戳(即从1970年1月1日00:00:00 GMT起的毫秒数),没有对时区和日期时间的细化处理。这导致了它在实际应用中有很多局限性,尤其是在处理时区、格式化等需求上。 |
1 LocalDateTime 和 Date 互转
1.1 LocalDateTime 转 Date
LocalDateTime.atZone(ZoneId.systemDefault()).toInstant() 和 Date.from()
public static void fun1() {
LocalDateTime time = LocalDateTime.now();
Date date = Date.from(time.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("Date: " + date);
}
Date: Mon Sep 23 11:25:52 CST 2024
1.2 Date 转 LocalDateTime
LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault())
public static void fun2() {
LocalDateTime time = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("LocalDateTime: " + time);
}
LocalDateTime: 2024-09-23T11:28:27.256
1.3 String 转 LocalDateTime
LocalDateTime.parse(str, DateTimeFormatter)
public static void fun3() {
String str = "2022-04-13 16:01:42";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US);
LocalDateTime time = LocalDateTime.parse(str, formatter);
System.out.println("LocalDateTime: " + time);
}
LocalDateTime: 2022-04-13T16:01:42
1.4 LocalDateTime 转 String
LocalDateTime.format(DateTimeFormatter)
public static void fun4() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US);
LocalDateTime time = LocalDateTime.now();
System.out.println("LocalDateTime: " + formatter.format(time));
}
LocalDateTime: 2024-09-23 11:31:49
2 ZonedDateTime 和 Date 互转
2.1 ZonedDateTime 转 Date
Date.from(zonedDateTime.toInstant())
public static void fun5() {
ZonedDateTime zoned = ZonedDateTime.now();
Date date = Date.from(zoned.toInstant());
System.out.println("Date: " + date);
}
Date: Mon Sep 23 11:12:03 CST 2024
2.2 Date 转 ZonedDateTime
ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault())
public static void fun6() {
Date date = new Date();
ZonedDateTime zoned = ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
System.out.println("ZonedDateTime: " + zoned);
}
ZonedDateTime: 2024-09-23T11:14:57.167+08:00[Asia/Shanghai]
2.3 String 转 ZonedDateTime
ZonedDateTime.parse(str, DateTimeFormatter)
public static void fun7() {
String str = "2024-09-23T11:14:57.167+08:00[Asia/Shanghai]";
ZonedDateTime zoned = ZonedDateTime.parse(str, DateTimeFormatter.ISO_ZONED_DATE_TIME);
System.out.println("ZonedDateTime: " + zoned);
}
ZonedDateTime: 2024-09-23T11:14:57.167+08:00[Asia/Shanghai]
2.4 ZonedDateTime 转 String
ZonedDateTime.format(DateTimeFormatter)
public static void fun8() {
ZonedDateTime zoned = ZonedDateTime.now();
String str = zoned.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
System.out.println("String: " + str);
}
String: 2024-09-23T11:20:03.0887278+08:00[Asia/Shanghai]
3 OffsetDateTime 和 Date 互转
3.1 OffsetDateTime -> Date
通过 toInstant() 转换为 Instant,再转换为 Date。
public static void fun9() {
Instant instant = OffsetDateTime.now().toInstant();
Date date = Date.from(instant);
System.out.println("Date: " + date);
}
Date: Mon Sep 23 14:28:52 CST 2024
3.2 Date -> OffsetDateTime
通过 toInstant() 获取 Instant,再结合 ZoneOffset 转换为 OffsetDateTime。
public static void fun10() {
Date date = new Date();
Instant instant = date.toInstant();
OffsetDateTime time = instant.atOffset(ZoneOffset.UTC);
System.out.println("OffsetDateTime: " + time);
}
OffsetDateTime: 2024-09-23T06:29:50.195Z
3.3 String -> OffsetDateTime
使用 OffsetDateTime.parse(),可根据需要提供 DateTimeFormatter。
public static void fun11() {
String str = "2024-09-23T14:30:15+02:00";
OffsetDateTime time = OffsetDateTime.parse(str);
System.out.println("OffsetDateTime: " + time);
}
public static void fun12() {
String dateTimeStr = "2024-09-23 14:30:15 +02:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X");
OffsetDateTime time = OffsetDateTime.parse(dateTimeStr, formatter);
System.out.println("OffsetDateTime: " + time);
}
OffsetDateTime: 2024-09-23T14:30:15+02:00
3.4 OffsetDateTime -> String
使用 OffsetDateTime.toString() 或 DateTimeFormatter 的 format() 方法。
public static void fun13() {
OffsetDateTime time = OffsetDateTime.now();
System.out.println("默认格式字符串: " + time.toString());
// 使用自定义格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X");
String formattedDate = time.format(formatter);
System.out.println("自定义格式字符串: " + formattedDate);
}
默认格式字符串: 2024-09-23T14:30:57.948408200+08:00 自定义格式字符串: 2024-09-23 14:30:57 +08
4 全部代码
package com.xu;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Locale;
/**
* @author hyacinth
*/
public class Test {
public static void main(String[] args) throws Exception {
fun13();
}
public static void fun1() {
LocalDateTime time = LocalDateTime.now();
Date date = Date.from(time.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("Date: " + date);
}
public static void fun2() {
LocalDateTime time = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("LocalDateTime: " + time);
}
public static void fun3() {
String str = "2022-04-13 16:01:42";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US);
LocalDateTime time = LocalDateTime.parse(str, formatter);
System.out.println("LocalDateTime: " + time);
}
public static void fun4() {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.US);
LocalDateTime time = LocalDateTime.now();
System.out.println("LocalDateTime: " + formatter.format(time));
}
public static void fun5() {
ZonedDateTime zoned = ZonedDateTime.now();
Date date = Date.from(zoned.toInstant());
System.out.println("Date: " + date);
}
public static void fun6() {
Date date = new Date();
ZonedDateTime zoned = ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
System.out.println("ZonedDateTime: " + zoned);
}
public static void fun7() {
String str = "2024-09-23T11:14:57.167+08:00[Asia/Shanghai]";
ZonedDateTime zoned = ZonedDateTime.parse(str, DateTimeFormatter.ISO_ZONED_DATE_TIME);
System.out.println("ZonedDateTime: " + zoned);
}
public static void fun8() {
ZonedDateTime zoned = ZonedDateTime.now();
String str = zoned.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
System.out.println("String: " + str);
}
public static void fun9() {
Instant instant = OffsetDateTime.now().toInstant();
Date date = Date.from(instant);
System.out.println("Date: " + date);
}
public static void fun10() {
Date date = new Date();
Instant instant = date.toInstant();
OffsetDateTime time = instant.atOffset(ZoneOffset.UTC);
System.out.println("OffsetDateTime: " + time);
}
public static void fun11() {
String str = "2024-09-23T14:30:15+02:00";
OffsetDateTime time = OffsetDateTime.parse(str);
System.out.println("OffsetDateTime: " + time);
}
public static void fun12() {
String dateTimeStr = "2024-09-23 14:30:15 +02:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X");
OffsetDateTime time = OffsetDateTime.parse(dateTimeStr, formatter);
System.out.println("OffsetDateTime: " + time);
}
public static void fun13() {
OffsetDateTime time = OffsetDateTime.now();
System.out.println("默认格式字符串: " + time.toString());
// 使用自定义格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss X");
String formattedDate = time.format(formatter);
System.out.println("自定义格式字符串: " + formattedDate);
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
