Django
Часовые пояса
Поиск…
Вступление
Часовые пояса часто являются препятствием для разработчиков. Django предлагает вам отличные утилиты, чтобы упростить работу с часовыми поясами.
Даже если ваш проект работает в одном часовом поясе, по-прежнему хорошей практикой является хранение данных в формате UTC в вашей базе данных для обработки случаев экономии дневного света. Если вы работаете в нескольких часовых поясах, то сохранение данных времени в формате UTC является обязательным.
Включить поддержку часового пояса
Во-первых, убедитесь, что USE_TZ = True
в файле settings.py
. Также установите значение по часовой TIME_ZONE
по умолчанию TIME_ZONE
например TIME_ZONE='UTC'
. Просмотрите полный список часовых поясов здесь .
Если USE_TZ
является False, TIME_ZONE
будет часовым поясом, который Django будет использовать для хранения всех дат. Когда USE_TZ
включен, TIME_ZONE
является часовым поясом по умолчанию, который Django будет использовать для отображения данных в шаблонах и для интерпретации дат, введенных в формы.
При включенной поддержке часового пояса, Джанго будет хранить datetime
- UTC
datetime
данных в базе данных в часовом поясе UTC
Установка часовых поясов сеанса
У объектов Python datetime.datetime
есть атрибут tzinfo
который используется для хранения информации о часовом поясе. Когда атрибут установлен, объект считается Aware, когда атрибут не установлен, он считается наивным.
Чтобы гарантировать, что часовой пояс наивен или осведомлен, вы можете использовать .is_naive()
и .is_aware()
Если USE_TZ
включены в вашем settings.py
файла, то datetime
и TIME_ZONE
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 %}
Обратите внимание: этот метод описан только в Django 1.10 и on. Для поддержки django от 1.10 смотрите MiddlewareMixin