IT/Django

django datetime Asia/Seoul LMT+8:28:00 STD Why not KST+9:00

bepuri 2021. 3. 17. 12:00
728x90

Django에서 로컬시간을 가지고 db에있는 데이터 유무를 필터링 해야하는 경우가 있었다.

 

먼저 django에서 date는 UTC기준으로 저장된다.

이걸 강제적으로 local 시간으로 저장할 수 있는 방법도 있으나, 그렇게되면 view나 serializer에서 시간 다루기가 굉장히 까다로워진다.

 

예를들어 국제 서비스를 한다고하였을때 UTC기준으로 저장이 되어있지않다면 국가별로 시간을 처리하는 로직을 스스로 다 짜야할 것이다.

 

그러나 장고에서는 이미 멋지게도 locale에 따라서 시간을 가져올 수 있게끔 해뒀다. 나는 장고를 믿고 거래하고 있었다.

하지만 이번에 view에서 로컬시간 기준으로 db에 있는 특정 데이터를 가져오는 과정에서 시간 문제가 발생했다.

 

엄밀히 말하면 pytz.timezone이 예상과 다르게 동작했다는 것이다.

 

웃긴에 pytz.timezone("Asia/Seoul")을 실행해보면 KST+9를 예상했으나, LMT+8:28:00이라는 애매한 숫자가 나왔다.

그러다보니 UTC와 KST 시간차를 8:28분으로보고 계산해서 내 예상과는 다른 데이터가 추출됐다.

 

실제 서버가 돌아갈때 이런 문제가 발생한다면 고객의 서비스 이용에 어려움을 줄 수 있다.

 

실상 timezone 정보가 저렇게 넘어오기 때문에 datetime의 tzinfo로 바로 사용하기는 어려웠다.

tzinfo로 바로 넘겨주면 9시간 더해지는게 아니라 8시 28분이 더해지기 때문에 시간 오차가 생긴다.

따라서 시간을 정상적으로 출력하기 위해서는

 

두가지 방법이 있다.

1. timezone 객체에서 localize함수를 호출하는 방법

예를들면

seoul = pytz.timezone("Asia/Seoul")

seoul.localize(datetime.now()) 라고 입력하면 정상적으로 UTC에서 9시간 빠른 시간이 나온다.

 

2. django의 localtime()을 사용하는 방법.

이것도 실제 내부 코드를 들여다보면 위와 같이 동작한다.

하지만 settings에 있는 TIMEZONE을 가지고와서 알아서 localize해준다.

 

django timezone에 대해서 좀 더 알고 싶다. 아래 글을 추천한다.

devlog.jwgo.kr/2020/10/28/using-timezone-in-django/

 

728x90