<Django> Datetime

jm_yoon·2021년 3월 7일
0
post-thumbnail

pytz

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

Datetime

python에서 날짜와 시간은 표현하는 아주 유용한 패키지이다.

데이터베이스의 시간은 utc로 저장하고 데이커를 가지고올 때 timezone을 localtime으로 바꿔주는 것이 좋다.

django에서 프로젝트 settings.py에서 USE_TZ=true TIME_ZONE='Asia/Seoul'로 설정하기

Naive VS Aware

  • Naive
    tzinfo 속성이 설정되지 않은 datetime 객체 (TIME_ZONE 변수로 지정한 시간대 사용)
  • Aware
    tzinfo 속성이 설정된 datetime 객체 (명확하게 기준이 되는 시간대를 tzinfo 속성으로 지정)

USE_TZ 설정에 따른 차이

장고는 내부적으로 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 객체를 사용하는 게 안전하다.

UTC -> localtime으로 바꿔서 보여주기

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로 변경

데이터베이스에 저장된 시간은 utc로 설정하고 데이터를 보여줄 때 한국시간으로 보여주기

# 기존코드 ,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",

참고
참고
참고
참고

profile
Hello!

0개의 댓글