Django의 timezone 문제를 파헤치다
핵심 내용
Django에서는 naive datetime과 aware datetime을 혼용하면 날짜 저장·비교에서 timezone 문제가 생긴다.
자세히 보기
Python 3.5와 Django 1.9, PostgreSQL 환경에서 날짜와 시간을 다루며 겪은 timezone 문제를 정리한다.
USE_TZ = True, TIME_ZONE = 'Asia/Seoul'로 설정해도 datetime.datetime.now()나 datetime.datetime.today()는 naive datetime을 반환한다. 반면 Django 모델을 통해 읽고 저장하는 DateTimeField 값은 UTC 기준의 time-zone-aware datetime이 되므로, 같은 시간처럼 보여도 내부 표현은 다를 수 있다.
이 차이 때문에 다음 문제가 생긴다.
- DB에서 읽은
DateTimeField값에.date()를 호출하면 UTC 날짜가 나온다. - 한국 시간 기준으로는 같은 날이어도, 오전 9시 이전이면 UTC에서는 전날로 바뀔 수 있다.
strptime()으로 만든 naive datetime과 aware datetime을 직접 비교하면 exception이 발생한다.DateField는DateTimeField와 달리 한국 날짜 기준으로 저장되고 읽힌다.
해결은 명확하다. 현재 시각이 필요하면 datetime.datetime.now() 대신 **django.utils.timezone.now()**를 써서 aware datetime을 사용한다. 한국 시간으로 변환해야 하면 **timezone.localtime()**을 사용한다.
어쩔 수 없이 naive datetime을 받아야 한다면 **timezone.make_aware()**로 aware datetime으로 바꾼 뒤 비교해야 한다.
결국 한국 시간대 서비스를 만들 때는 “보이는 시간”과 “저장·비교되는 시간”이 다를 수 있다는 점을 항상 의식해야 하며, naive datetime을 섞어 쓰지 않는 것이 핵심이다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.