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





5.00/5 (2投票s)
将 Instant 转换为 LocalDateTime/LocalDate/LocalTime
1. 什么是 Java 中的 Instant?
在 Java 中,Instant
是 Java 标准库 (java.time
包) 中的一个类,它表示一个特定的时间点,不带有时区信息,即 UTC。Instant
是一个不可变的表示时间点的对象,精确到纳秒。它用于表示时间戳、经过的时间和其他与时间相关的值。
Instant
可以从纪元时间创建,纪元时间是从 1970 年 1 月 1 日 00:00:00 UTC 开始经过的秒数,或者从其他日期和时间相关的值创建,例如 LocalDateTime
或 ZonedDateTime
。
Java 中的Instant
不具有关联的时区。Instant
表示单个时间点,与任何特定时区无关。无论在世界上的哪个地方使用Instant
,它的值都是相同的,并且它不会根据夏令时或其他时区更改而改变。
2. 什么是 LocalDateTime、LocalDate、LocalTime?
LocalDateTime
、LocalDate
和 LocalTime
是 Java 标准库 (java.time
包) 中的类,它们以更易于人类阅读的格式表示日期和时间信息。
LocalDateTime
表示日期和时间,不带时区,例如 2022-01-20 12:30:15
。
LocalDate
表示日期,不带时间和时区,例如 2022-01-20
。
LocalTime
表示时间,不带日期或时区,例如 12:30:15
。
当您不需要跟踪时区,只需要以更易于阅读的格式表示日期和时间值时,可以使用这些类。当您需要对日期和时间值执行操作而不需要了解特定时区时,也可以使用它们。
LocalDateTime
、LocalDate
和 LocalTime
仍然提供了在默认时区(JVM 运行的本地时区)获取当前日期和时间的方法,而无需存储时区详细信息。
LocalDateTime
、LocalDate
、LocalTime
在世界各地并不相同。LocalDateTime
在特定时区的上下文中表示日期和时间。不同的时区与协调世界时 (UTC) 具有不同的偏移量,因此在一种时区中相同的LocalDateTime
在另一种时区中将具有不同的等效值。
现在,让我们看看如何将 Instant 转换为 LocalDateTime
或 LocalDate
或 LocalTime
。
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. 结论
LocalDateTime
/LocalDate
/LocalTime
,只需两个简单的步骤。