Java 21 JVM Option

Java Instant 사용하기

Instant 란?

  • Java 8에서 도입된 시간 API로, UTC(협정 세계시) 기준의 시간을 나타내는 클래스
  • 시간대와 무관하게 항상 동일한 시간을 표현하며, 주로 타임스탬프나 시간 기반 연산 사용

주요 특징

  1. UTC 기준: 모든 시간이 UTC 기준으로 표현
  2. nanosecond 정밀도: 초 단위와 나노초 단위의 정밀도를 모두 제공
  3. 불변 객체: 모든 시간 연산은 새로운 Instant 객체 반환
  4. 시간대 독립: 시간대 정보를 포함하지 않아 전 세계 어디서나 동일한 시간을 표현 가능

Usage

// 현재 시간 가져오기
val now = Instant.now()

// epochSecond 가져오기
val epochSecond = now.epochSecond

// 나노초 가져오기
val nanoSecond = now.nano

// 특정 시간의 Instant 생성
val specificTime = Instant.ofEpochSecond(1234567890)

// 시간 비교
val instant1 = Instant.ofEpochSecond(1234567890)
val instant2 = Instant.ofEpochSecond(1234567891)
val isBefore = instant1.isBefore(instant2)
val isAfter = instant1.isAfter(instant2)

// Instant -> LocalDateTime
val localDateTime = LocalDateTime.ofInstant(now, ZoneId.systemDefault());

// LocalDateTime -> Instant
Instant instant = localDateTime.toInstant(ZoneOffset.UTC);

주의 사항

  1. 시간대 변환: Instant는 시간대 정보가 없으므로, 특정 시간대로 변환할 때는 ZoneId 를 명시적 지정 필요
  2. 정밀도: 나노초 단위의 정밀도를 제공하지만, 실제 시스템의 정밀도는 하드웨어에 따라 상이할 수 있음
  3. 성능: Instant.now() 는 시스템 시계를 읽어오므로, 빈번한 호출은 시스템 부하 가능

LocalDateTime 차이점

  1. 시간대 처리:
    • Instant: UTC 기준, 시간대와 무관
    • LocalDateTime: 시간대 정보 없음, 명시적 변환 필요
  2. 사용 목적:
    • Instant: 타임스탬프, 시간 기반 연산
    • LocalDateTime: 로컬 시간 표현, 날짜/시간 조작
  3. 정밀도:
    • Instant: 나노초 단위
    • LocalDateTime: 나노초 단위

Conclusion

  • Instant 는 시간대와 무관한 시간 표현이 필요한 경우에 특히 유용
  • 분산 시스템이나 타임스탬프 기반 연산에서 LocalDateTime 보다 더 적합한 시간 연산 가능
  • 하지만, 사용자 인터페이스나 로컬 시간 표현이 필요한 경우에는 LocalDateTime 사용하는 것이 더 적절할 수 있음