Java 9에서는 ofInstant() 메서드가 새롭게 도입되어 java.time.Instant 객체를 다양한 날짜·시간 타입으로 간편하게 변환할 수 있게 되었습니다. 이 메서드는 LocalDate, LocalTime, LocalDateTime 클래스에 포함된 정적(static) 메서드로, Instant 객체를 변환할 때 java.time.ZoneId 형태의 시간대 정보를 반드시 함께 전달해야 합니다.
Java 8에서는 Instant를 LocalDate나 LocalTime으로 변환하려면 instant.atZone(zone).toLocalDate()처럼 여러 단계를 거쳐야 했지만, Java 9부터는 ofInstant() 메서드 하나로 코드를 훨씬 더 간결하고 직관적으로 작성할 수 있습니다.
문법(Syntax)
public static LocalTime ofInstant(Instant instant, ZoneId zone) public static LocalDate ofInstant(Instant instant, ZoneId zone) public static LocalDateTime ofInstant(Instant instant, ZoneId zone)
예제 코드
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);
}
}실행 결과
Instant: 2020-02-05T02:35:15.245Z LocalDate: 2020-02-05 LocalTime: 08:05:15.245 LocalDateTime: 2020-02-05T08:05:15.245
핵심 포인트 정리
위 예제에서 주목할 점은 시간대(time zone)가 결과에 미치는 영향입니다. 원본 Instant 값은 UTC 기준 02:35:15.245이지만, Asia/Kolkata(인도 표준시, UTC+5:30) 시간대로 변환되면서 시간이 08:05:15.245로 조정된 것을 확인할 수 있습니다. 즉, ofInstant() 메서드는 지정한 ZoneId에 맞춰 날짜와 시간을 자동으로 보정해 줍니다.
정리하면, Java 9의 ofInstant() 메서드는 다음과 같은 장점을 제공합니다.
- 간결성: atZone(), toLocalDate() 등의 체이닝 없이 한 번의 호출로 변환 가능
- 일관성: LocalDate, LocalTime, LocalDateTime 모두 동일한 방식으로 사용
- 시간대 처리: ZoneId를 명시적으로 전달하므로 시간대 관련 오류를 사전에 방지