go time.Truncate()

Wonwoo Seo·2024년 2월 1일

Truncate?

파라미터로 받는 duration 단위로 시간값을 절삭하는 메서드.
time.Time을 초, 분, 시간 등의 설정한 단위로 round down할 수 있다. 하지만, 문서를 자세히 읽어보지 않으면 함정에 빠질 수 있는 부분이 있다!

함정

예를 들어, 한국시간 기준으로 전일 24시(오늘 0시)의 시간값을 얻고 싶을 때

kst := time.FixedZone("KST", 9 * 60 * 60)
now := time.Now() // 2024-02-01T12:30:00Z
kstNow := now.In(kst) // 2024-02-01T21:30:00+09:00
kstMidnight := kstNow.Truncate(24 * time.Hour) // 24시간 단위로 절삭

fmt.Println(kstMidnight.Format(time.RFC3339)) // 예상 값: 2024-02-01T00:00:00+09:00

위 코드처럼 time.Truncate()를 사용하면 될 것 같지만, 실제로 코드를 실행해보면..

fmt.Println(kstMidnight.Format(time.RFC3339)) // 실제 값: 2024-02-01T09:00:00+09:00

한국시간으로 오전 9시에 해당하는 시간값이 출력된다. 한국시간 24시간 기준으로 truncate 한건데??

Why?

time.Truncate()의 문서를 확인해보면 주석에서 since the zero time 이라는 문구를 볼 수 있는데, 구현을 들여다보면 unix time을 간단히 duration으로 나눠서 나머지를 시간값에서 빼버리는 것을 확인할 수 있다. 즉, UTC 기준으로 시간이 절삭된다는 것이다!

위의 예시의 경우, UTC 기준으로 절삭된 12시간 30분이 kstNow에서 빠지면서 결과적으로 한국시간 오전 9시라는 결과가 나타나게 된 것이다.

이런 케이스에서는 time.Date()를 이용해 직접 시간값을 생성하는 방법이 안전해 보이고, 실제로 time.Truncate() 문서의 예시에서도 추천하는 방법이다.

profile
Blockchain / Backend Developer

0개의 댓글