Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Tầm quan trọng của phương thức ofInstant() trong Java 9

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().