[TIL] Error 2: offset-naive and offset-aware datetimes

Jene Hojin Choi·2021년 2월 22일
2

Error List

목록 보기
2/5
post-thumbnail

1. can't subtract offset-naive and offset-aware datetimes

TypeError: can't subtract offset-naive and offset-aware datetimes 

아래와 같이 datetime끼리 빼주는 값을 구하기 위한 코드를 짜다가 에러가 난 것이다.

#django의 app에 있는 views.py
datetime.now() - comment.created_at

에러가 처음 났을때 혹시 데이터 타입이 달라서 안되는 줄 알고 각각의 타입을 찍어보았다.
그런데 둘다 <class 'datetime.datetime'>이었다... 그러면 뭐가 문제였을까? ㅜ

print(type(datetime.now()))
>> <class 'datetime.datetime'>

print(type(comment.created_at))
>> <class 'datetime.datetime'>

무슨 에러일까? 저 에러가 나타나는 이유는 datetime.now와 comment.created_at의 timezone이 다르게 설정되어있기 때문이라고 한다. 하나는 timezone이 설정되어있고, 하나는 설정이 되어있지 않기 때문이다.

2. Solutions

2-1. .replace(tzinfo=None)

이 방법은 내가 Stackoverflow에 도움을 요청한 후 얻어낸 값이다.
Can't subtract offset-naive and offset-aware datetimes

.replace(tzinfo=None)을 쓰게 된다면 해당 DateTime의 timezone을 없애준다.

#django의 app에 있는 views.py
datetime.now() - comment.created_at.replace(tzinfo=None)

>> 0:55:53.918817

2-2. django settings.py에서 USE_TZ = True -> USE_TZ = False

해당 django project에 settings.py의 line 115쯤을 보면 다음과 같은 코드들이 있다.

# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

나의 에러의 경우에는 datetime.now()는 timezone이 설정되어있지 않지만, django와 연동되어있는 comment.created_at의 경우에는 timezone이 설정되어있기 때문이었다.

default로 위와 같이 USE_TZ = True로 설정이 되어있다. 이는 timezone을 장고에서 자동 설정해주는 것이다.

그렇다면 굳이 replace를 쓸 필요없이 datetime끼리 편하게 더해주고 빼주는 연산이 필요하다면 USE_TZ = False로 바꾸어주면 계산이 된다.

Wrap-up

  1. .replace(tzinfo=None)을 쓰면 timezone 세팅을 없애준다.
    그러면 <class 'datetime.datetime'> 끼리는 더해주고 빼줄 수 있다.
  1. 해당 django 프로젝트에서 timezone이 필요하지 않다면 settings.py에서 USE_TZ = False로 수정해주면 된다.

1개의 댓글

comment-user-thumbnail
2021년 2월 22일

오늘 이걸로 마이페이지 끝냅니다ㅠ 블로깅 해주셔서 감사합니다 호진님 ❤️❤️

답글 달기