Java 9 thêm phương thức static ofInstant() cho LocalDate, LocalTime, LocalDateTime để chuyển đổi. Chuyển java.time.Instant → LocalDate/LocalTime/LocalDateTime yêu cầu time zone (java.time.ZoneId).
Cú pháp
public static LocalTime ofInstant(Instant instant, ZoneId zone) public static LocalDate ofInstant(Instant instant, ZoneId zone) public static LocalDateTime ofInstant(Instant instant, ZoneId zone)
Ví dụ
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.Instant;
import java.time.ZoneId;
public class OfInstantMethodTest {
public static void main(String args[]) {
Instant instant = Instant.parse("2020-02-05T02:35:15.245Z");
System.out.println("Instant: " + instant);
LocalDate ld = LocalDate.ofInstant(instant, ZoneId.of("Asia/Kolkata"));
System.out.println("LocalDate: " + ld);
LocalTime lt = LocalTime.ofInstant(instant, ZoneId.of("Asia/Kolkata"));
System.out.println("LocalTime: " + lt);
LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.of("Asia/Kolkata"));
System.out.println("LocalDateTime: " + ldt);
}
}
Kết quả
Instant: 2020-02-05T02:35:15.245Z LocalDate: 2020-02-05 LocalTime: 08:05:15.245 LocalDateTime: 2020-02-05T08:05:15.245
Giải thích
Instant: Thời điểm trên timeline UTC (epoch nanoseconds).ZoneId.of("Asia/Kolkata"): Múi giờ UTC+5:30 (India).- Chuyển đổi: UTC 02:35 + 5:30 = 08:05 local time.
- Ngày không đổi vì chuyển đổi trong cùng ngày.
So sánh với cách cũ (pre-Java 9)
// Cũ: Phức tạp, dễ sai
ZonedDateTime zdt = instant.atZone(ZoneId.of("Asia/Kolkata"));
LocalDate ld = zdt.toLocalDate();
LocalTime lt = zdt.toLocalTime();
LocalDateTime ldt = zdt.toLocalDateTime();
// Mới: Trực tiếp, rõ ràng
LocalDate ld = LocalDate.ofInstant(instant, zone);
LocalTime lt = LocalTime.ofInstant(instant, zone);
LocalDateTime ldt = LocalDateTime.ofInstant(instant, zone);
Khi nào dùng?
- Chuyển timestamp UTC (database, log, API) → local date/time cho hiển thị user.
- Xử lý timezone-aware business logic.
- Thay thế
Instant.atZone(zone).toLocalDate()verbose.
ofInstant() làm API Date-Time Java (JSR-310) hoàn thiện hơn, đối xứng với atZone().