현재 A&I 동아리 레포트 관리 프로젝트를 하며 레포트가 끝나는 시간에 맞춰
레포트가 안 보이게하는 api를 생성하였는데 데이터베이스의 시간이 UTC로 맞추어 있어
현재 서울 시간에 맞게 제대로 파싱해야하는 작업을 하고 있었습니다.
이에 필요성을 느끼고 코틀린에서 다루는 날짜와 시간 클래스에 대해 알아보려 합니다.
코틀린은 JVM 위에 실행되기에 Java API를 직접 활용하여 시간과 날짜를 나타내게 됩니다.
LocalDate와 LocalTime을 합친 객체로 날짜(Date), 시간(Time) 정보를 포함하지만
시간대에 대한 정보가 없다는 특징이 있습니다.
또한 Local이기에 특정 지역의 시간 개념을 나타냅니다.
import java.time.LocalDateTime
val localDateTime = LocalDateTime.now()
println(localDateTime) // 예: 2025-03-30T15:30:45
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]
UTC 기준의 절대 시간을 나타내는 객체로
특정 순간을 나타내며, 시간대 개념이 없고 협정 세계시를 기준으로 시간이 나타납니다.
import java.time.Instant
val instant = Instant.now()
println(instant) // 예: 2025-03-30T06:30:45.123Z
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
시간 없이 날짜만 저장할 때 사용하는 클래스입니다.
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) // 한 달 뒤
마찬가지로 날짜 없이 시간을 저장할 때 사용하는 클래스입니다.
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분 전
날짜 및 시간을 원하는 형식으로 변환하는 데 사용됩니다.
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
| 패턴 | 의미 | 예제 입력 | 예제 출력 |
|---|---|---|---|
yyyy | 연도 (4자리) | 2025-03-30 | 2025 |
yy | 연도 (2자리) | 2025-03-30 | 25 |
MM | 월 (2자리) | 2025-03-30 | 03 |
M | 월 (1~2자리) | 2025-3-5 | 3 |
dd | 일 (2자리) | 2025-03-30 | 30 |
d | 일 (1~2자리) | 2025-3-5 | 5 |
HH | 시간 (24시간제, 2자리) | 15:08:30 | 15 |
H | 시간 (24시간제, 1~2자리) | 9:08:30 | 9 |
hh | 시간 (12시간제, 2자리) | 3:08:30 PM | 03 |
h | 시간 (12시간제, 1~2자리) | 3:08:30 PM | 3 |
mm | 분 (2자리) | 15:08:30 | 08 |
m | 분 (1~2자리) | 15:8:30 | 8 |
ss | 초 (2자리) | 15:08:30 | 30 |
s | 초 (1~2자리) | 15:08:5 | 5 |
SSS | 밀리초 (3자리) | 15:08:30.123 | 123 |
a | AM/PM | 15:08:30 | PM |
EEE | 요일 (짧은 형식) | 2025-03-30 | Sun |
EEEE | 요일 (긴 형식) | 2025-03-30 | Sunday |
G | 연대 (BC/AD) | 2025 | AD |
z | 시간대 (짧은 형식) | GMT+9 | KST |
Z | 시간대 (숫자 형식) | GMT+9 | +0900 |
X | ISO-8601 시간대 | GMT+9 | +09 |
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를 작성해봅시다.