65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在 Java 中将 Instant 转换为 LocalDateTime 或 LocalDate 或 LocalTime

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2023 年 2 月 8 日

CPOL

3分钟阅读

viewsIcon

11743

将 Instant 转换为 LocalDateTime/LocalDate/LocalTime

1. 什么是 Java 中的 Instant?

在 Java 中,Instant 是 Java 标准库 (java.time 包) 中的一个类,它表示一个特定的时间点,不带有时区信息,即 UTC。Instant 是一个不可变的表示时间点的对象,精确到纳秒。它用于表示时间戳、经过的时间和其他与时间相关的值。

Instant 可以从纪元时间创建,纪元时间是从 1970 年 1 月 1 日 00:00:00 UTC 开始经过的秒数,或者从其他日期和时间相关的值创建,例如 LocalDateTimeZonedDateTime

Java 中的 Instant 不具有关联的时区。Instant 表示单个时间点,与任何特定时区无关。无论在世界上的哪个地方使用 Instant,它的值都是相同的,并且它不会根据夏令时或其他时区更改而改变。

2. 什么是 LocalDateTime、LocalDate、LocalTime?

LocalDateTimeLocalDateLocalTime 是 Java 标准库 (java.time 包) 中的类,它们以更易于人类阅读的格式表示日期和时间信息。

LocalDateTime 表示日期和时间,不带时区,例如 2022-01-20 12:30:15

LocalDate 表示日期,不带时间和时区,例如 2022-01-20

LocalTime 表示时间,不带日期或时区,例如 12:30:15

当您不需要跟踪时区,只需要以更易于阅读的格式表示日期和时间值时,可以使用这些类。当您需要对日期和时间值执行操作而不需要了解特定时区时,也可以使用它们。

LocalDateTimeLocalDateLocalTime 仍然提供了在默认时区(JVM 运行的本地时区)获取当前日期和时间的方法,而无需存储时区详细信息。

LocalDateTimeLocalDateLocalTime 在世界各地并不相同。LocalDateTime 在特定时区的上下文中表示日期和时间。不同的时区与协调世界时 (UTC) 具有不同的偏移量,因此在一种时区中相同的 LocalDateTime 在另一种时区中将具有不同的等效值。

现在,让我们看看如何将 Instant 转换为 LocalDateTimeLocalDateLocalTime

3. 从 Instant 转换为 LocalDateTime/LocalDate/LocalTime

有两种方法可以从 Instant 转换

3.1. 使用 atZone() 并指定 ZoneId

Instant 类提供了一个方法 atZone,它在指定的时区返回 ZonedDateTime。使用这个 ZonedDateTime,我们可以转换为 LocalDateTime 等。

Instant instant = Instant.now();

LocalDateTime localDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();

LocalDate localDate = instant.atZone(ZoneId.systemDefault()).toLocalDate();

LocalTime localTime = instant.atZone(ZoneId.systemDefault()).toLocalTime();
由于 Instant 始终位于 UTC 时区,因此我们必须首先将其转换为特定时区的 ZonedDateTime,然后将其转换为 LocalDateTime/LocalDate/LocalTime

3.2. 使用 LocalDateTime/LocalDate/LocalTime 的 ofInstant()

这三个类都提供了方法 ofInstant,它接受 Instant 和时区 ID,并将其转换为相应类的对象

Instant instant = Instant.now();

LocalDateTime.ofInstant(instant, ZoneId.systemDefault())

LocalDate.ofInstant(instant, ZoneId.systemDefault())

LocalTime.ofInstant(instant, ZoneId.systemDefault())

即使 LocalDateTime/LocalDate/LocalTime 不存储时区信息,它们也始终在特定时区的上下文中表示日期和时间,无论是系统默认时区还是世界上任何特定的时区。因此,我们需要传递 Zone Id 以及 Instant。

4. 结论

在本教程中,我们已经看到了如何在 Java 中将 Instant 转换为 LocalDateTime/LocalDate/LocalTime,只需两个简单的步骤。

© . All rights reserved.