java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java日期时间类LocalDateTime和Date互转

Java日期时间类LocalDateTime和Date怎么互转?一文搞懂转换方法

作者:深色風信子

还在为Java日期时间类的转换发愁?本文详细讲解LocalDateTime、ZonedDateTime、OffsetDateTime与Date之间的互转方法,包含代码示例和对比分析,帮你轻松处理时区和时间格式问题
类名包名说明
LocalDatejava.time无时间的日期
LocalTimejava.time无日期的时间
LocalDateTimejava.time无时区的日期时间
ZonedDateTimejava.time带时区的日期时间
OffsetDateTimejava.time带有偏移量的日期时间
Instantjava.time时间戳
Datejava.util旧的日期时间类,带有时区限制
Calendarjava.util可操作日期时间,支持时区
java.sql.Datejava.sql用于数据库的日期
java.sql.Timejava.sql用于数据库的时间
java.sql.Timestampava.sql用于数据库的日期时间
特性LocalDateTimeZonedDateTimeDate
时区支持不支持支持不支持
线程安全是是否
推荐使用是是否
用途处理本地日期时间处理跨时区日期时间仅处理简单的时间戳
API丰富、现代化的API丰富、现代化的API较为陈旧,需借助其他工具类
类型特性
LocalDateTimeLocalDateTime 是 java.time 包中的类,是 Java 8 引入的 java.time API(也叫 JSR 310)的一部分,用于表示没有时区的日期和时间。它结合了 LocalDate 和 LocalTime,仅处理日期和时间的本地表示,不考虑时区的差异。
ZonedDateTimeZonedDateTime 是另一个 Java 8 引入的类,它表示带有时区的日期和时间。与 LocalDateTime 不同,ZonedDateTime 包含完整的时区信息,能够处理不同地区之间的时间差异。
DateDate 是 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);
    }

}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文