[Django] DateTimeField와 TimeZone (부제: 왜 자꾸 UTC로 저장되는가)

리미·2020년 12월 30일
3

Django ERROR

목록 보기
2/2
post-thumbnail

오랜만에 미들웨어를 리팩토링하면서 DRF를 사용하고있는데,
DateTimeField에 현재시간을 넣을일이 생겼었다
그런데 아래에 것들을 사용해도 DB에 insert된 내용을 보면 모두 UTC로 저장이 되는데,

from datetime import datetime
from django.utils import timezone

datetime.now()	# naive
timezone.now()	# aware

분명 Django settings엔 TIME_ZONE = 'Asia/Seoul' 로 잘 잡혀있다
이상하게 또 Django에서는 한국시간으로 잘 가져온다.

Aware와 Naive

처음엔 Aware와 Naive의 차이인건가 싶었다.
여기서 Aware와 Naive는 datetime의 객체들을 말한다.

① Aware : 시간대정보(tzinfo)속성과 날짜,시간을 가지는 datetime 객체
② Naive : 날짜와 시각만을 가지는 객체 (TIME_ZONE)

그런데 어차피 장고에선 값이 같을수밖에 없는게 Aware든 Naive든
둘다 따로 시간대정보를 지정하지 않았으니 값이 똑같이 나오지않을까?
이건 내가 원하는 답이 아닌것같다.

갓 공식문서

공식문서에 내가 원하는 해답이 적혀있었다

When USE_TZ is False, this is the time zone in which Django will store all datetimes.
When USE_TZ is True, this is the default time zone that Django will use to display datetimes in templates and to interpret datetimes entered in forms.

대충 직역하면 USE_TZFalse면 timezone은 모든 datetime들을 저장할때 사용하고
USE_TZTrue면 템플릿에 datetime들을 표시하고 form에 입력한 날짜를 해석하는데에 사용된다고한다.

정리하면

  • USE_TZ = True : template와 form에만 적용됨(그외는 UTC)
  • USE_TZ = False : 모든 경우 저장할때도 적용됨

USE_TZFalse로 수정하니까 해결되었다!
혹시나 template와 form이 안먹힐까봐 확인해봤는데 정상으로 작동하는걸 확인함!

해결인증샷


profile
Python이 하고싶은데 자꾸 Flutter 시켜서 빡쳐서 만든 블로그

3개의 댓글

comment-user-thumbnail
2021년 12월 2일

도움이 됐습니다 감사합니다

답글 달기
comment-user-thumbnail
2022년 4월 21일

저렇게 설정하면 db관리에 문제가 있지 않을까 싶어서 다른방법을 고민했었는데.. 괜한 걱정이었던것 같네요. 좋은 정보 감사합니다!

답글 달기
comment-user-thumbnail
2022년 4월 22일

와 궁금한 점이 해결되었습니당 👍🏻

답글 달기