코틀린(Kotlin)에서 날짜/시간 다루기 - LocalDate.now, LocalDateTime.now, ZonedDateTime.now

개발/안드로이드1 2025. 12. 8. 08:01

 

1. 날짜·시간을 표현하는 기본 타입들

 

Kotlin에서는 Java 8+ 날짜/시간 API를 그대로 사용하며, 대표적인 타입은 아래와 같습니다.

 

  • LocalDate : 날짜만 저장 (예: 2025-01-10)
  • LocalTime : 시간만 저장 (예: 14:30:10)
  • LocalDateTime : 날짜 + 시간
  • ZonedDateTime : 날짜 + 시간 + 타임존
  • Instant : UTC 기준의 timestamp

 

실제 코드를 보겠습니다.

val today = LocalDate.now()
val now = LocalTime.now()
val dateTime = LocalDateTime.now()
val zoned = ZonedDateTime.now()
val instant = Instant.now()

여기까지는 생성만 했고, 대부분은 포맷팅과 파싱을 함께 사용하게 됩니다.

 


 

2. 날짜·시간 포맷팅하기 (문자열로 만들기)

UI에 보여줄 때는 사람이 읽을 수 있는 문자열로 변환해야 합니다.

이럴 때 DateTimeFormatter 를 사용합니다.

val date = LocalDate.now()
val formatted = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))

println(formatted)  // 예: 2025-12-07

 

자주 쓰는 패턴을 몇 개만 정리하면 다음과 같습니다.

패턴 출력 예시
yyyy-MM-dd 2025-12-07
HH:mm:ss 14:22:10
yyyy-MM-dd HH:mm 2025-12-07 14:22
yyyyMMdd 20251207
HHmmss 142210

필요하면 복잡한 포맷도 만들 수 있습니다.

 


 

3. 문자열을 날짜/시간으로 파싱하기

API 응답이나 서버에서 문자열로 날짜를 내려주는 경우가 흔합니다.

그럴 때 다시 날짜 타입으로 변환해야 합니다.

val text = "2025-12-07 14:22"
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")

val dateTime = LocalDateTime.parse(text, formatter)

println(dateTime)  // 2025-12-07T14:22

형식이 정확히 맞지 않으면 파싱 오류가 발생할 수 있으니 포맷 문자열을 꼭 맞춰야 합니다.

 


 

4. 타임존 다루기 (ZonedDateTime)

앱 개발하다 보면 지역별 시간을 고려해야 할 때가 꽤 있습니다.

이럴 때는 ZonedDateTime 또는 Instant + ZoneId 조합을 많이 씁니다.

val seoulTime = ZonedDateTime.now(ZoneId.of("Asia/Seoul"))
val newYorkTime = ZonedDateTime.now(ZoneId.of("America/New_York"))

UTC 기반으로 쓰고 싶다면 Instant → ZoneId 로 치환할 수도 있습니다.

val utc = Instant.now()
val kst = utc.atZone(ZoneId.of("Asia/Seoul"))

 

5. 날짜/시간 생성하는 다양한 방법

현재 시간이 아닌 특정 시점을 직접 만들고 싶을 때도 있죠.

 

LocalDate 생성

val date = LocalDate.of(2025, 12, 25)

 

LocalDateTime 생성

val dateTime = LocalDateTime.of(2025, 5, 10, 14, 30, 0)

 

문자열로부터 생성

위에서 설명한 파싱 방식과 동일하게 가능합니다.

 


 

6. 서버 타임스탬프 변환(Unix timestamp)

서버에서 timestamp 를 초 또는 밀리초 기준으로 내려주는 경우가 흔합니다.

밀리초(ms) 기준

val timestamp = 1733550000000L
val instant = Instant.ofEpochMilli(timestamp)
val dateTime = instant.atZone(ZoneId.of("Asia/Seoul"))

println(dateTime)

 

초(s) 기준

val timestamp = 1733550000L
val instant = Instant.ofEpochSecond(timestamp)

이 방식은 로그 분석이나 백엔드 통신할 때 자주 써서 익혀두면 편합니다.

 


 

7. 기존 Date/Calendar 와의 변환

레거시 코드가 아직 남아있는 경우도 많습니다.

그럴 때 변환하는 방법도 알아두면 좋습니다.

 

Date → LocalDateTime

val date = Date()
val localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()

 

LocalDateTime → Date

val dateTime = LocalDateTime.now()
val date = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant())

 

반응형
admin