[Kotlin] 날짜와 시간 클래스

Hood·2025년 3월 30일

Kotlin

목록 보기
15/18
post-thumbnail

들어가기 전

현재 A&I 동아리 레포트 관리 프로젝트를 하며 레포트가 끝나는 시간에 맞춰
레포트가 안 보이게하는 api를 생성하였는데 데이터베이스의 시간이 UTC로 맞추어 있어
현재 서울 시간에 맞게 제대로 파싱해야하는 작업을 하고 있었습니다.
이에 필요성을 느끼고 코틀린에서 다루는 날짜와 시간 클래스에 대해 알아보려 합니다.


Java API

코틀린은 JVM 위에 실행되기에 Java API를 직접 활용하여 시간과 날짜를 나타내게 됩니다.

날짜와 시간을 동시에 나타내는 클래스

1. LocalDateTime

LocalDate와 LocalTime을 합친 객체로 날짜(Date), 시간(Time) 정보를 포함하지만
시간대에 대한 정보가 없다는 특징이 있습니다.
또한 Local이기에 특정 지역의 시간 개념을 나타냅니다.

import java.time.LocalDateTime

val localDateTime = LocalDateTime.now()
println(localDateTime)  // 예: 2025-03-30T15:30:45

2. ZoneDateTime

LocalDateTime + 시간대(Time Zone) 정보를 포함한 객체입니다.
따라서 세계 여러 지역의 시간을 다룰 수 있습니다.
따라서 국제적인 어플에 많이 사용됩니다.

import java.time.ZonedDateTime
import java.time.ZoneId

val zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Seoul"))
println(zonedDateTime)  // 예: 2025-03-30T15:30:45+09:00[Asia/Seoul]

3. Instant

UTC 기준의 절대 시간을 나타내는 객체로
특정 순간을 나타내며, 시간대 개념이 없고 협정 세계시를 기준으로 시간이 나타납니다.

import java.time.Instant

val instant = Instant.now()
println(instant)  // 예: 2025-03-30T06:30:45.123Z

날짜 및 시간 함수와 클래스의 활용

1. Clock

Clock은 시스템 시간을 가져오는 데 사용하며, 테스트 코드에서 시간을 조작할 때 유용합니다.
Clock.systemUTC(), Clock.systemDefaultZone() 등을 사용할 수 있습니다.

import java.time.Clock
import java.time.Instant

val clock = Clock.systemUTC()
val instant = Instant.now(clock)

println(instant)  // 예: 2025-03-30T06:30:45Z

2. LocalDate

시간 없이 날짜만 저장할 때 사용하는 클래스입니다.

import java.time.LocalDate

val today = LocalDate.now()
println(today)  // 예: 2025-03-30

val tomorrow = today.plusDays(1)  // 하루 뒤
val yesterday = today.minusDays(1)  // 하루 전
val nextMonth = today.plusMonths(1)  // 한 달 뒤

3. LocalTime

마찬가지로 날짜 없이 시간을 저장할 때 사용하는 클래스입니다.

import java.time.LocalTime

val now = LocalTime.now()
println(now)  // 예: 15:30:45.123

val later = now.plusHours(2)  // 2시간 후
val earlier = now.minusMinutes(30)  // 30분 전

4. DateTimeFormatter

날짜 및 시간을 원하는 형식으로 변환하는 데 사용됩니다.

import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

val now = LocalDateTime.now()
val formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")

val formatted = now.format(formatter)
println(formatted)  // 예: 2025/03/30 15:30:45

4-1. DateTimeFormatter 패턴 정리

패턴의미예제 입력예제 출력
yyyy연도 (4자리)2025-03-302025
yy연도 (2자리)2025-03-3025
MM월 (2자리)2025-03-3003
M월 (1~2자리)2025-3-53
dd일 (2자리)2025-03-3030
d일 (1~2자리)2025-3-55
HH시간 (24시간제, 2자리)15:08:3015
H시간 (24시간제, 1~2자리)9:08:309
hh시간 (12시간제, 2자리)3:08:30 PM03
h시간 (12시간제, 1~2자리)3:08:30 PM3
mm분 (2자리)15:08:3008
m분 (1~2자리)15:8:308
ss초 (2자리)15:08:3030
s초 (1~2자리)15:08:55
SSS밀리초 (3자리)15:08:30.123123
aAM/PM15:08:30PM
EEE요일 (짧은 형식)2025-03-30Sun
EEEE요일 (긴 형식)2025-03-30Sunday
G연대 (BC/AD)2025AD
z시간대 (짧은 형식)GMT+9KST
Z시간대 (숫자 형식)GMT+9+0900
XISO-8601 시간대GMT+9+09

5. 시간 비교

isBefore(), isAfter() 를 사용하여 두 개의 날짜 또는 시간을 비교할 수 있습니다.

val date1 = LocalDate.of(2025, 3, 30)
val date2 = LocalDate.of(2099, 3, 30)

println(date1.isBefore(date2))  // true
println(date1.isAfter(date2))  // false

📌결론

나에게 주어진 요구사항에 맞는 형식으로 날짜와 시간을 파싱해봅시다.
데이터베이스의 시간에 따라 적절한 API를 작성해봅시다.

profile
달을 향해 쏴라, 빗나가도 별이 될 테니 👊

0개의 댓글