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이 설정되어있고, 하나는 설정이 되어있지 않기 때문이다.
이 방법은 내가 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
해당 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
로 바꾸어주면 계산이 된다.
- .replace(tzinfo=None)을 쓰면 timezone 세팅을 없애준다.
그러면 <class 'datetime.datetime'> 끼리는 더해주고 빼줄 수 있다.
- 해당 django 프로젝트에서 timezone이 필요하지 않다면 settings.py에서
USE_TZ = False
로 수정해주면 된다.
오늘 이걸로 마이페이지 끝냅니다ㅠ 블로깅 해주셔서 감사합니다 호진님 ❤️❤️