在Java编程中,处理时间是一个常见的需求。Java 8引入了新的日期和时间API,提供了更直观和灵活的方式来处理日期和时间。本文将介绍Instant、LocalDateTime、LocalDate和LocalTime的概念,并探讨它们之间的转换方法。
Instant是Java中表示特定时间点的类,它与任何时区无关,即它总是以UTC(协调世界时)来表示。Instant是不可变的,并且以纳秒为单位提供时间点的精确表示。它常用于表示时间戳、经过的时间以及其他与时间相关的值。
Instant可以从epoch time(自1970年1月1日00:00:00 UTC以来经过的秒数)或其他日期和时间相关的值创建,如LocalDateTime或ZonedDateTime。Instant在Java中不包含时区信息,它代表一个独立于任何特定时区的单一时间点。Instant的值在世界任何地方都是相同的,并且不会因夏令时或其他时区变化而改变。
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有两种方法:
Instant类提供了atZone方法,该方法返回指定时区的ZonedDateTime。使用这个ZonedDateTime,可以将其转换为LocalDateTime和其他类。
Java
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。
这三个类都提供了ofInstant方法,该方法接受Instant和区域ID,并将它们转换为相应类的对象:
Java
Instant instant = Instant.now();
LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
LocalDate.ofInstant(instant, ZoneId.systemDefault());
LocalTime.ofInstant(instant, ZoneId.systemDefault());