2013-10-02 2 views
4

В settings.py у меня есть:Django, кажется, отображая DateTimes в формате UTC

TIME_ZONE = 'Asia/Singapore' 
USE_I18N = True 
USE_L10N = True 
USE_TZ = True 

Если пользователь (кто живет в Сингапуре) входит 2013-10-07 01:00 A.M. форму на моем сайте, значение, хранящееся в моей (PostgreSQL) - 2013-10-07 01:00:00+08. Когда я вытягиваю эту информацию во время сеанса python manage.py shell, я получаю 2013-10-06 17:00:00+00:00. То же самое происходит, когда я пытаюсь отобразить эту информацию в шаблоне.

Что я думаю: Django признает, что пользователь вводит 1:00 A.M. 10 октября, время в Сингапуре, и сохраняет это в базе данных как 2013-10-07 01:00:00+08. Однако, когда Django извлекает эту информацию из базы данных, она форматирует ее по времени UTC, тем самым давая 2013-10-06 17:00:00+00:00.

Есть ли у меня это право? И если да, то что я могу сделать для отображения времени отображения Django с использованием той же информации о часовом поясе, которая хранится в базе данных (или, по крайней мере, с использованием моей настройки TIME_ZONE)? Другими словами, как я могу сделать это так, чтобы пользователь видел дату и время в той же форме, что и она?

ответ

2

Вы смотрели на localtime тег шаблона

обновление: Однако это действительно относится к установке USE_TZ в True, как у вас есть

+0

Спасибо за ответ; Кажется, я понял это. См. Мой ответ на мой вопрос. – GChorn

10

Я понял, что происходит. Исходя из того, что я прочитал в документации here, я предполагал, что с USE_TZ=True, Django будет выводить DateTimes в текущем часовом поясе (который по умолчанию настройки TIME_ZONE) везде --views, оболочка и т.д.

Однако оказалось, что Django только делает преобразование в шаблонах, и даже тогда только в самом прямом, базовом вызове объекта datetime.

В частности, если у вас есть object с DateTimeField и вы предоставляете его атрибут datetime в шаблоне с помощью {{ object.datetime }}, вы получите DateTime превращали в текущем часовом поясе. Ура. Однако эта функция не будет работать для что-нибудь еще, даже внутри шаблонов, таких как {{ object.datetime.hour }} (который будет отображать час в UTC). Таким образом, это просто невидимый шаблонный тег. Не так волшебно, как я надеялся!

Похоже, мне нужно будет преобразовать все даты в текущий часовой пояс в мои представления, прежде чем передавать их в мои шаблоны. Я нахожу этот странный и противоречивый подход, учитывая, что в моей базе данных уже есть все временные данные, хранящиеся в часовом поясе. Я хочу, чтобы они отображались. Не было бы лишнего смысла указывать Django, что вы хотите получить значения базы данных, выраженные в UTC, чем заставить Django выполнять работу автоматически, а затем заставить вас изменить их в своих представлениях?

EDIT: Это answer на SO сделал решение моей конкретной значительно ситуации проще:

from django.utils.timezone import localtime 

result = localtime(some_time_object) 

EDIT: Оказывается, что только PostgreSQL хранит информацию о часовом поясе, и эта информация отделена от исходные значения даты и времени, которые хранятся в UTC. Поэтому я считаю, что Django имеет смысл отображать все в UTC по умолчанию, поскольку другие бэкэнды базы данных даже не хранят информацию о часовом поясе.

+0

Еще одна вещь, о которой следует помнить: если вы создаете знакомое datetime, у которого есть связанный с ним объект tzinfo, затем сохраните его в Postgres, затем получите его, новое datetime будет точным, но не будет иметь оригинальный tzinfo. Это означает, что если вы сравните предварительно сохраненные и сохраненные datetimes с символом ==, он вернет True, но они не являются тем же самым точным объектом, поскольку временные интервалы отличаются. – vaughnkoch

+0

Mysql также позволяет хранить информацию о временной зоне в поле. – IJR

Смежные вопросы