[210727 TIL - (1)] Django

4069 단어 djangoTILTIL

TIME-ZONE

장고 프로젝트 파일의 settings.py에는 시간대와 관련된 설정을 할 수 있는 대표적인 변수로서 TIME_ZONE과 USE_TZ가 존재한다.

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

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Seoul'

USE_I18N = True

USE_L10N = True

USE_TZ = True
  • 프로젝트 파일의 settings.py에는 다음과 같은 변수들이 존재한다.

datetime 객체의 종류

Naive 객체

  • tzinfo 속성이 설정되지 않은 datetime 객체
    • TIME_ZONE 변수로 지정한 시간대 사용

Aware 객체

  • tzinfo 속성이 설정된 datetime 객체
    • 명확하게 기준이 되는 시간대를 tzinfo 속성으로 지정

USE_TZ 설정에 따른 차이

USE_TZ = False

  • 장고는 내부적으로 Naive 객체를 사용한다.
  • 즉 장고 개발시 Naive Datetime 객체를 사용해야한다.
  • 기준 시간대 => TIME_ZONE

USE_TZ = True

  • 장고는 내부적으로 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, 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)

<참고>

좋은 웹페이지 즐겨찾기