코틀린(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())
반응형




