pytz
라이브러리는 datetime
을 쉽게 다룰 수 있도록 도와준다.
pytz가 제공하는 시간대 식별자 확인하기
import pytz
for tz in pytz.all_timezones:
print(tz)
# 출력결과
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
.
.
settings.py에서 설정한 시간 출력
from datetime import datetime
from pytz import utc
now = datetime.now()
print(now)
//2021-02-27 14:20:08.235438
python에서 날짜와 시간은 표현하는 아주 유용한 패키지이다.
데이터베이스의 시간은 utc로 저장하고 데이커를 가지고올 때 timezone을 localtime으로 바꿔주는 것이 좋다.
django에서 프로젝트 settings.py에서 USE_TZ=true TIME_ZONE='Asia/Seoul'
로 설정하기
장고는 내부적으로 Aware datetime 객체를 사용한다. 즉 장고 개발 시 Aware datetime 객체를 사용해야 한다. (기준 시간대를 명확히 지정해줘야 함)
폼에 입력된 날짜 값은 Current time zone으로 해석한 뒤 Aware datetime 객체로 변환되고, 템플릿에 렌더링할 때는 Aware datetime 객체를 Current time zone으로 변환한다.
※ 만약 Naive datetime 객체를 사용하면 어떻게 될까?
하위호환성을 위해 Naive datetime 객체를 사용해도 문제가 없도록 설계가 되어 있다. 데이터베이스에 저장될 때 Naive datetime 객체를 Aware datetime 객체로 변환하고, 경고만 띄워준다. 하지만 그것도 DST 등으로 인한 문제가 발생할 여지는 있기 때문에, 항상 Aware datetime 객체를 사용하는 게 안전하다.
from datetime import datetime
from pytz import timezone
now_utc = datetime.now(timezone('UTC')) # 현재시간을 utc로 표시
now_kst = now_utc.astimezone(timezone('Asia/Seoul')) # utc를 kst로 변경
# 기존코드 ,db에 저장된 그대로 나옴(utc)
"created_at" : post.created_at
# 결과
//“created_at”: “2021-03-06T07:55:02.563Z”,
# 한국시간으로 보여주기
"created_at" : post.created_at.astimezone(timezone('Asia/Seoul'))
# 결과
//“local_created_at”: “2021-03-06T16:55:02.563+09:00",