Как показать местное время пользователю в django?
Я разрабатываю приложение Django У меня есть модель, в которой временные метки добавляются автоматически. Я хочу показывать время конечным пользователям в соответствии с их местным часовым поясом.
Вот мой код:
settings.py
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
model.py
date_created = models.DateTimeField(auto_now_add=True, null=True)
шаблон
{{object.date_created}}
Но он показывает время UTC Я хочу, чтобы он определял текущий часовой пояс пользователя и отображал дату и время соответственно.
Фреймворк Django предоставляет встроенный способ отображения местного времени для пользователя. Когда Django рендерит шаблон, он автоматически передает в него переменную {{ localtime }}. . Эта переменная содержит текущее местное время в часовом поясе пользователя.
Если вы хотите отобразить местное время в определенном формате, вы можете использовать фильтр шаблона Django |date: "FORMAT" . Например, чтобы отобразить местное время в формате "long", вы можете использовать следующий код:
{{ localtime|date: "l, F jS Y H:i" }}
Это выведет что-то вроде "Воскресенье, 1 января 2017 12:00".
Ваши данные хранятся в UTC, что хорошо. Когда вы получаете объект поля DateTime из базы данных, это будет наивный объект datetime.datetime. т.е. дата/время без привязки к часовому поясу. Затем вам предстоит выполнить преобразование.
Пользователи вашего webapp могут находиться в разных часовых поясах, поэтому для каждого запроса должно происходить преобразование в соответствующий часовой пояс. Вот почему существует функция activate для установки текущего часового пояса.
Если у вас установлен pytz, вы должны иметь возможность сделать следующее:
from django.utils.timezone import activate
activate(settings.TIME_ZONE)
Вывод поля даты в шаблонизаторе затем будет автоматически преобразовывать наивные объекты дата-время в правильный часовой пояс для отображения.
Если у вас есть только один наивный экземпляр datetime.datetime, для которого вы хотите установить часовой пояс, то просто используйте модуль pytz напрямую. Однако не следует делать это в представлениях, поскольку хорошей идеей является преобразование часового пояса только на этапе представления.
from pytz import timezone
settings_time_zone = timezone(settings.TIME_ZONE)
last_updated = last_updated.astimezone(settings_time_zone)