LoGin
article thumbnail
반응형

 

시스템이 다양한 타임존에서 동작할 때, UTC(협정 세계시)를 기준으로 작업해야 하는 경우가 많습니다. 제가 하는 프로젝트가 세계 어디에서든 사용할 수 있도록 i18n까지 도입하고 협정 세계시도 적용해서 동적으로 바꿔 보여주는 작업을 거칩니다.

사용자에게는 로컬 시간을 보여줘야 하죠.

Spring Boot에서 LocalDateTime과 처리했던 일을 기록해 봅니다.

 

 

LocalDateTime과 ZonedDateTime의 차이

 

LocalDateTime은 타임존 정보를 가지지 않는 시간 정보를 제공합니다. 즉, 시스템의 로컬 타임존에 기반한 날짜와 시간 정보를 나타냅니다. 시간대 정보가 없으므로 단순하게 현재의 시간 정보만을 나타냅니다.

 

ZonedDateTime은 타임존을 포함하는 시간 정보를 제공합니다. 즉, 특정 타임존을 명시적으로 지정할 수 있고, 다른 타임존과 변환이 가능합니다. 제가 하고 있는 글로벌 서비스에서는 이를 사용해야겠죠.

 

 

데이터를 처리할 때 사용했던 방식은

  • 데이터 베이스에 UTC-0를 적용해서 저장합니다.
  • 사용자에게 데이터를 보여줄 때 사용자 지정 타임존을 적용시켜서 보여줍니다.

이렇게 하면 사용자 별로 각 지역에서 자기 시간에 최적화된 시간을 확인할 수 있습니다.

 

 

사용한 코드

    // 현재 UTC 시간을 가져옴
    val nowUtc = LocalDateTime.now(ZoneId.of("UTC")).atZone(ZoneId.of("UTC"))
    
    // 특정 타임존 적용 (예: 서울)
    val zonedDateTimeSeoul = nowUtc.withZoneSameInstant(ZoneId.of("Asia/Seoul"))
    
    // 포맷 지정 (yyyyMMdd)
    val formatter = DateTimeFormatter.ofPattern("yyyyMMdd")
    
    // 변환된 로컬 시간을 지정된 포맷으로 변환
    val stringToday = zonedDateTimeSeoul.format(formatter)

 

 

UTC로 변환

    // 로컬 시간을 UTC로 변환
    val utcDateTime = userZonedDateTime.withZoneSameInstant(ZoneId.of("UTC"))
    
    // DB에 저장할 포맷 (예: 'yyyy-MM-dd HH:mm:ss')
    val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
    val formattedUtcDateTime = utcDateTime.format(formatter)

 

시간대 입력하는 방법은 여럿 있겠지만 위에처럼 사용해도 되겠습니다.

 

 

 

단순히 필요한 것만 사용해서 구현했지만 실제로는 위에 두 라이브러리는 많은 함수를 담고 있습니다.

문서 링크 남겨둘 테니 확인하시고 필요한 거 활용해서 원하는 데이터를 만들면 되겠습니다.

 

문서

ZonedDateTime

 

 

ZonedDateTime (Java SE 21 & JDK 21)

All Implemented Interfaces: Serializable, Comparable >, ChronoZonedDateTime , Temporal, TemporalAccessor A date-time with a time-zone in the ISO-8601 calendar system, such as 2007-12-03T10:15:30+01:00 Europe/Paris. ZonedDateTime is an immutable representat

docs.oracle.com

LocalDateTime

 

LocalDateTime (Java SE 21 & JDK 21)

All Implemented Interfaces: Serializable, Comparable >, ChronoLocalDateTime , Temporal, TemporalAccessor, TemporalAdjuster A date-time without a time-zone in the ISO-8601 calendar system, such as 2007-12-03T10:15:30. LocalDateTime is an immutable date-time

docs.oracle.com

 

728x90
반응형
profile

LoGin

@LoGinShin

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!