Django
시간대
수색…
소개
시간대는 종종 개발자에게 번거로운 요소입니다. Django는 시간대를 쉽게 사용할 수 있도록 훌륭한 유틸리티를 제공합니다.
프로젝트가 단일 시간대에서 실행되는 경우에도 데이터베이스에 UTC로 데이터를 저장하여 일광 절약 시간을 처리하는 것이 좋습니다. 여러 시간대에서 작업하는 경우 시간 데이터를 UTC로 저장해야합니다.
표준 시간대 지원 사용
먼저, settings.py
파일에서 USE_TZ = True
인지 확인하십시오. 또한 할 기본 시간대 값 설정 TIME_ZONE
등 TIME_ZONE='UTC'
. 시간대의 전체 목록을 보려면 여기를 클릭하십시오 .
USE_TZ
가 거짓이면, TIME_ZONE
은 장고가 모든 datetimes를 저장하는데 사용할 시간대가 될 것입니다. USE_TZ
가 활성화되면 TIME_ZONE
은 Django가 템플릿에 datetime을 표시하고 양식에 입력 된 datetime을 해석하는 데 사용할 기본 표준 시간대입니다.
시간대 지원이 활성화되면 django는 datetime
데이터를 데이터베이스에 UTC
시간대로 저장합니다
세션 시간대 설정
Python의 datetime.datetime
객체에는 표준 시간대 정보를 저장하는 데 사용되는 tzinfo
특성이 있습니다. 속성이 설정되면 객체는 Aware로 간주되고 속성이 설정되지 않으면 Naive로 간주됩니다.
시간대가 순진하거나 인식 가능하도록하려면 .is_naive()
및 .is_aware()
사용할 수 있습니다.
당신이 경우 USE_TZ
당신의 활성화 settings.py
파일, datetime
기본으로 시간대 정보가 오래 첨부해야합니다 TIME_ZONE
설정되어 settings.py
경우에 따라이 기본 시간대가 좋을 수도 있지만 특히 여러 시간대의 사용자를 처리하는 경우에는 충분하지 않을 수 있습니다. 이를 수행하려면 미들웨어를 사용해야합니다.
import pytz
from django.utils import timezone
# make sure you add `TimezoneMiddleware` appropriately in settings.py
class TimezoneMiddleware(object):
"""
Middleware to properly handle the users timezone
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# make sure they are authenticated so we know we have their tz info.
if request.user.is_authenticated():
# we are getting the users timezone that in this case is stored in
# a user's profile
tz_str = request.user.profile.timezone
timezone.activate(pytz.timezone(tz_str))
# otherwise deactivate and the default time zone will be used anyway
else:
timezone.deactivate()
response = self.get_response(request)
return response
몇 가지 새로운 일이 있습니다. 미들웨어와 그 기능에 대해 더 알고 싶으면 문서의 해당 부분을 확인하십시오. __call__
우리는 시간대 데이터의 설정을 처리하고 있습니다. 먼저이 사용자에 대한 표준 시간대 데이터가 있는지 확인하기 위해 사용자가 인증되었는지 확인합니다. 우리가 알게되면 timezone.activate()
사용하여 사용자 세션의 시간대를 활성화합니다. 우리가 가지고있는 시간대 문자열을 datetime으로 변환하기 위해서, 우리는 pytz.timezone(str)
합니다.
이제 템플릿에서 datetime 객체에 액세스하면 데이터베이스의 'UTC'형식에서 사용자가있는 시간대로 자동 변환됩니다. datetime 객체에 액세스하면 이전 미들웨어가 설정된 것으로 가정하여 해당 시간대가 설정됩니다 정확히.
{{ my_datetime_value }}
사용자의 시간대 사용 여부에 대한 세부적인 제어가 필요하면 다음을 살펴보십시오.
{% load tz %}
{% localtime on %}
{# this time will be respect the users time zone #}
{{ your_date_time }}
{% endlocaltime %}
{% localtime off %}
{# this will not respect the users time zone #}
{{ your_date_time }}
{% endlocaltime %}
이 방법은 장고 1.10 이상에서만 작동합니다. 1.10 이전의 장고를 지원하려면 MiddlewareMixin을 살펴보십시오.