반응형
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
- 클라이언트는 해당 값을 로컬 시간으로 변환해 사용해야 합니다.
반응형
'skill > Java.Kotlin' 카테고리의 다른 글
Oracle + Kotlin + JPA 연결 (0) | 2025.06.12 |
---|---|
SpringBoot 등록자, 등록일, 수정자, 수정일 자동 삽입 (0) | 2025.06.12 |
JPA 에러 JpaSystemException, IdentifierGenerationException (0) | 2024.01.12 |
springboot @Scheduler 다중 서버에서 한번만 실행 : shedlock (1) | 2023.11.21 |
[springboot] yml 과 Properties 설정 (1) | 2023.11.21 |