찔끔찔끔씩😎

[Django] TIME_ZONE, USE_TZ 설정 (datetime 과 timezone) 본문

Server/Django

[Django] TIME_ZONE, USE_TZ 설정 (datetime 과 timezone)

댕경 2022. 1. 10. 11:27
728x90
from datetime import datetime
from django.utils import timezone

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

장고 개발시에 aware 객체를 쓰는 것이 안전하다고 하는데

datetime 과 timezone 의 차이가 궁금했다.

계속 datetime 을 사용해왔기 때문..


1.  navie datetime VS aware datetime

1) navie

- timezone 정보가 없음. ( 표준시간대가 없는 경우 )

- tzinfo 속성 설정되지 않음.

2) aware

- timezone 정보가 있음. ( 표준시간대가 세팅된 경우 )

- tzinfo 속성 설정되어 있음.


2. USE_TZ 설정

USE_TZ 값  
False 장고는 내부적으로 Naive datetime 객체를 사용한다. 
기준 시간대는 TIME_ZONE 이 된다.
True 장고는 내부적으로 Aware datetime 객체를 사용한다.
기준 시간대를 명확히 지정해 주어야 한다.

폼에 입력된 날짜 값은 Current time zone으로 해석한 뒤 Aware datetime 객체로 변환되고, 템플릿에 렌더링할 때는 Aware datetime 객체를 Current time zone으로 변환한다.

※ 만약 Naive datetime 객체를 사용하면 어떻게 될까?

하위호환성을 위해 Naive datetime 객체를 사용해도 문제가 없도록 설계가 되어 있다. 데이터베이스에 저장될 때 Naive datetime 객체를 Aware datetime 객체로 변환하고, 경고만 띄워준다. 하지만 그것도 DST 등으로 인한 문제가 발생할 여지는 있기 때문에, 항상 Aware datetime 객체를 사용하는 게 안전하다.

3. 관련된 라이브러리

1) timezone.localtime(): 특정 시간대 기준 Aware 객체 -> TIME_ZONE 시간대 기준 Aware 객체

2) timezone.make_aware(): 시간대 기준이 없는 Naive 객체 -> TIME_ZONE 시간대 기준의 Aware 객체

from datetime import datetime, date, timedelta
from django.utils import timezone
import pytz

datetime.now()  # Naive (TIME_ZONE)

datetime.now(pytz.UTC)  # Aware (UTC)

timezone.now()  # Aware (UTC)

timezone.localtime(datetime.now(pytz.UTC))  # Aware (UTC) → Aware (TIME_ZONE)

timezone.localtime(timezone.now())  # Aware (UTC) → Aware (TIME_ZONE)

timezone.make_aware(datetime.now())  # Naive (TIME_ZONE) → Aware (TIME_ZONE)

 


4. 예시  ) TIME_ZONE = 'Asia/Seoul' , USE_TZ = True

① datetime 객체를 사용할 땐 언제나 Aware 객체를 사용하자. timezone.now()가 권장된다.

② 그러면 DB에 저장되는 값도 UTC 기준 시간대로 저장되고, DB에서 값을 읽어올 때도 UTC 기준 시간대로 읽힌다.

③ 물론 템플릿에 렌더링 할 때는 알아서 한국 시간대로 변환이 되기 때문에 UTC라고 걱정할 필요는 없다.

④ 만약 UTC 기준 시간대의 Aware 객체를 한국 시간대의 Aware 객체로 변환하고 싶다면 timezone.localtime() 함수를 사용하자.

⑤ 참고로 DateField는 걱정하지 않고 사용해도 된다. 언제나 TIME_ZONE 기준 시간이 사용된다.

Comments