skill/Java.Kotlin

Kotlin UTC

have a nice day :D 2025. 6. 12. 21:36
반응형

Kotlin의 Instant란?
java.time.Instant (Java 8 이상 표준)
- UTC 기준의 "절대 시각"을 밀리초 또는 나노초 단위로 표현

사용 예시 (Kotlin)

현재 시각 구하기

import java.time.Instant val now: Instant = Instant.now() println(now) // 예: 2025-06-04T03:00:00Z
 

Instant → epochMillis (밀리초)

val epochMillis = now.toEpochMilli() println(epochMillis) // 예: 1749050400000
 

epochMillis → Instant

val fromMillis = Instant.ofEpochMilli(1749050400000) println(fromMillis) // 2025-06-04T03:00:00Z
 

Instant → 한국 시간(LocalDateTime)

 
val seoulTime = now.atZone(ZoneId.of("Asia/Seoul")).toLocalDateTime() println(seoulTime) // 2025-06-04T12:00


* 밀리세컨드 변환이란?
날짜/시간을 1970년 1월 1일 00:00:00 UTC 기준으로 몇 밀리초가 지났는지로 바꾸는 것

 

Oracle 날짜 타입

TIMESTAMP 날짜+시간, 시간대 없음 → KST로 해석 필요 DB에는 그게 UTC인지 알 수 없음
TIMESTAMP WITH TIME ZONE 날짜+시간+시간대 포함 → UTC 기준 저장 가능, 시간대 명확 Instant와 1:1 대응

* 시간대(Time Zone) 란?
- 장소에서 사용하는 표준 시간 기준
- 지리적 위치 + 시차(오프셋) + DST(서머타임)

구분 TIMESTAMP TIMESTAMP WITH TIME ZONE
시간대 정보 포함 없음 있음
저장된 시간 해석 DB 세션/서버 시간대에 따라 달라짐 저장된 시간+시간대 기준으로 정확히 해석
표현 예시 '2025-06-04 12:30:00' '2025-06-04 12:30:00 +00:00'
비교/정렬 값 비교는 가능, 시간대 불일치 시 의미 왜곡 시간대 포함된 절대 시점 기준으로 정확히 정렬 가능
글로벌 시스템 적합성 낮음 (오해 위험) 국제 서비스, API, Kafka 로그 등에 필수

DB 조회 (서울 기준)

SELECT
  create_at,
  create_at AT TIME ZONE 'UTC' AS utc_time,
  create_at AT TIME ZONE 'Asia/Seoul' AS kst_time
FROM my_table;

 

서버 <-> 클라이언트 시간 전송

- 밀리초(epoch milliseconds, UTC 기준)로 주는게 제일 좋음

* 공통 시간 포맷 정책
- 모든 시간은 UTC 기준의 epoch milliseconds (long) 제공됩니다.
- 
예: 1749040200000 → 2025-06-04T12:30:00Z
- 클라이언트는 해당 값을 로컬 시간으로 변환해 사용해야 합니다.

반응형