AI Briefing

Django의 timezone 문제를 파헤치다

·2017.05.31 00:00

핵심 내용

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가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.

AI 처리 방식을 확인하거나, 요약 오류와 출처 표기 문제, 삭제 요청을 문의 · 건의로 알려주세요.