Java 8 이상이 되면서 Date, Calandar 등이 레거시가 되어 버리고 java.time의 Instant, LocalDateTime, ZoneDateTime이 추가되었다.
Date, Calendar 클래스의 문제점
- 불변 객체가 아니라 thread-safe 하지 않음
- 날짜 단위의 계산이 불편함
- 표준 시간에 대한 기준이 모호함
Legacy에서 마이그레이션시 추천 타입
JDBC에서 변경되는 형태
Instant
1970년 1월 1일 UTC의 첫 번째 순간 이후의 현재 시간까지의 나노초를 나타낸 값
일반적으로 순간을 표현할 때 사용하며, Unix Timestamp를 구할 때 사용할 수 있다.
Unix Timestamp를 사용하는 이유는 숫자 자료형을 가지고 연산을 하기 때문에 Local/Offset/ZonedDateTime과 비교했을 때 속도가 훨씬 빠르다.
val instant: Instant = Instant.now()
println("instant : $instant") //2024-11-13T00:38:47.668310700Z
참고
Unix Timestamp는 2038년 문제가 있다.
1970년 1월 1일 자정부터 214748364초가 지난 2038년 1월 19일 화요일 03:14:08 UTC까지 표현이 가능하다.
이것을 보완한 것이 Instant 클래스이다.
LocalDateTime
LocalDateTime은 날짜 + 시간 정보를 가지고 있다.
Timezone 이 없고 Local 시간에 맞춰서 시간을 표현하고 있다.
글로벌 서비스가 아닌 국내 서비스가 대상일 경우 LocalDateTime을 사용하는 것을 추천
val localDate = LocalDateTime.now()
println(localDate) //2024-11-13T09:38:47.670350400
OffestDateTime
OffsetDateTime은 LocalDateTime + ZoneOffset의 개념
OffsetDateTime은 UTC보다 몇 시간/분/초 앞 또는 뒤의 컨텍스트를 사용하여 순간 날짜 및 시간을 나타낸다.
val zoneOffset = OffsetDateTime.now()
println(zoneOffset) //2024-11-13T09:38:47.670350400+09:00
ZonedDateTime
ZonedDateTime은 OffsetDateTime + ZoneRegion 의 개념
OffsetDateTime과의 차이점은 DST(Daylight Saving Time)과 같은 Time Transition Rule을 포함하는 ZoneRegion의 유무 차이
몇 개의 나라의 경우, 서머타임을 적용하기 때문에 때로는 겨울, 여름을 다르게 써야 하는데, 이를 자바에서는 하나의 TimeZone으로 통일하고 Time Trasition Rule 가지는 ZoneRules를 통해 알아서 내부적으로 계산해 준다.
결론
val instant: Instant = Instant.now()
println("instant : $instant") // 2024-11-13T00:38:47.668310700Z
val localDate = LocalDateTime.now()
println("localDate : $localDate") // 2024-11-13T09:38:47.670350400
val zoneOffset = OffsetDateTime.now()
println("zoneOffset : $zoneOffset") // 2024-11-13T09:38:47.670350400+09:00
val zonedDateTime = ZonedDateTime.now()
println("zonedDateTime : $zonedDateTime") // 2024-11-13T09:38:47.671379900+09:00[Asia/Seoul]
- 정확한 시간과 빠른 연산이 필요한 경우에는 Instant
- 글로벌이 아닌 국내에서만 서비스 예정인 경우 LocalDateTime
- 해외와 시간대 비교가 필요한 경우는 OffsetDateTime
- OffsetDate에서 각 나라의 특성에 따라 시간이 변경될 경우도 고려하면 ZonedDateTime
프로젝트의 상황과 성격에 따라서 Date Type을 정해서 사용하면 될 것 같다.
참고
Java 8 LocalDateTime vs Instant 어떤 상황에서 쓰는게 적합한가?
Java 8 LocalDateTime vs Instant 어떤 상황에서 쓰는게 적합한가? 들어가기 전에 본 글은 세션 공유용 자료이며 LocalDateTime, Instant 의 개념에 관한 짧은 글이 아니므로 양해 부탁드립니다. 포스팅 계기 최
sujl95.tistory.com
https://velog.io/@lsb156/Instant-vs-LocalDateTime
Java8+ Instant vs LocalDateTime 각 사용방법
Java 8 이상되면서 Date, Time, Timestamp등이 레거시가 되어버리고 LocalDateTime, ZonedDateTime, LocalTime, Instant 등등이 나왔지만 어디에 적절하게 사용되어야 하는지 적절하게 구분하기 휘애 블로깅을 했씁니
velog.io
긴 글 읽어 주셔서 감사합니다.
'JAVA & KOTLIN' 카테고리의 다른 글
[SPRING] Spring @Transactional (2) | 2024.12.22 |
---|---|
[KOTLIN] Kotlin에서 Value Object 언제 사용할까? (2) | 2024.12.21 |
[KOTLIN] Kotlin by 키워드: 상속보다 위임을 선택해야 하는 이유 (0) | 2024.12.16 |
[KOTLIN] Kotlin의 check와 require (2) | 2024.12.14 |
Kotlin - List to Array, Array to List (0) | 2021.11.06 |