JAVA

날짜/시간 처리

쥐4 2025. 1. 24. 09:41

요청으로 json의 시간을 String으로 받는다.

이때, 우리는 그 시간을 시간 객체로 파싱해주어야 한다.

시간 객체로 파싱은 DB를 고려해서 해야한다.

 

들어가기에 앞서...

ISO 시간 형식

ISO 시간 형식 : YYYY-MM-DD HH:mm:ss OR YYYY-MM-DDz  (UTC일때)

UTC : 협정 세계시로, 하나의 값만 가진다. 보통 second 뒤에 z가 붙는다면 UTC이다. 즉, UTC +-N을 한 값이 로컬 시간인 것이다.

 

java.time.

=> 날짜, 시간, 순간, 기간 등의 대표적인 자바 패키지이다.

=> ISO 형식에 기초를 둔다.

=> Immutable하고, 스레드 안전하다.

=> 모든 dates와 times관련 타입에서 파싱이 가능한 메서드를 지원한다.

=> timezone을 지원하지 않는 클래스와 지원하는 클래스로 나뉜다.

=> timezone 지원: ZonedDateTime

=> timezone 미지원: Instant, LocalDateTime/Date/Time

 

 

 

LocalDateTime

<LocalDateTime 출력값>

로컬 데이트 타임은 저런 식으로 나온다.

=> 날짜와 시간 사이 T가 붙는다.

=>소수점 뒷자리가 길다.

 

 

 

LocalDate

<LocalDate>

로컬 데이트는 저런 식으로 나온다.

=> ISO 날짜 형식과 일치한다.

 

LocalTime

<LocalTime>

로컬 타임은 저런 식으로 나온다.

=> 뭔가 LocalDateTime보다 짧다.

=> 날짜와 시간 동시에 가져오고 이걸 자를때, 잘린다고 합니다.

 

Instant

<Instant>

인스텐트는 저런 식으로 나온다.

=> UTC 시간이기 때문에, 뒤에 z가 붙는다.

<위에서부터 Instant, LocalDateTime, LocalDate, LocalTime>
<공식문서 java.time 패밀리 메서드들>

of -> 객체 생성

parse -> String(CharSet)을 시간 객체로 만들 수 있다.

나머지는 알아서 하도록!

 

java.sql

=> 이 글에서 설명할 것은 Timestamp밖에 없다.

=> Timestamp는 UTC로 저장

=> 클라이언트 로컬, 백엔드 서버에서 Timestamp값은 동일

=> Timestamp값을 db에 insert 시 타임존에 맞춰서 mysql은 변환

=> 다시 select 시 타임존에 맞춰 로컬 시간으로 변환

 

=> String(프론트, 백 서버, JSON) -> DateTimeFormatter를 이용한 파싱 LocalDateTime("yyyy-MM-dd HH:mm:ss") -> Timestamp.valueOf(Timestamp로 변환) -> db 저장(UTC로 저장)

<클라이언트에서 db까지 변환 과정(백엔드)>

 

=> db에서 Select(백엔드로 넘어오며, 로컬 시간으로 변환) -> Timestamp를 LocalDateTime으로 변환 -> LocalDateTime을 String으로 변환 -> json으로 주기

<db에서 클라이언트까지 변환 과정(백엔드)>

 

 

이때, 타임존을 한국 따로, 미국따로 어디따로 등등으로 하고 싶으면, 

Timestamp(UTC) -> Instant(UTC) -> ZonedDateTime(여러나라 시간) 이런식으로 바꿔야한다.

 

결론

시간을 타임존까지 건드리지 않으려면, DB와 Hibernate의 기능인 @CreateTimeStamp로 LocalDateTime과 매핑이 되니, 이걸로 저장하면 될것같고,

타임존을 건드리고 싶으면, Timestamp로 db저장, Instant로 변환, ZonedDateTime으로 각 타임존에 맞게 변환 가능.

 

(계속업뎃예정)