본문 바로가기
JAVA & KOTLIN

[JAVA] java 1.8에서 변경 된 time

by nozee 2024. 12. 17.
반응형

 

 

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을 정해서 사용하면 될 것 같다.

 

참고

https://sujl95.tistory.com/85

 

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

긴 글 읽어 주셔서 감사합니다.
 
반응형