Поиск…


Вступление

Часовые пояса часто являются препятствием для разработчиков. 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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow