Ouput с учетом часовых поясов Django поля даты и времени без фильтров
Привет, я обновился до django 1.4 и хочу воспользоваться поддержкой часового пояса. Я получил несколько полей даты и времени, сохраненных в postgres, и они были сохранены в предположении о часовом поясе моего города, как только я установил
USE_TZ = True
И установите часовой пояс для моего города, теги фильтра даты в моих шаблонах выводят правильный час (часовой пояс)
{{ concert.datetime|date:'f' }}
Проблема заключается в следующем: я использую дату и время для создания моих URL, например так:
{% url event artist_slug=concert.slug_name hour=concert.datetime.hour %}
И они не правильно синхронизированы по времени, час все еще в UTC, и это меняет мои ссылки, что-то, что я не могу сделать, это потеряло бы все звание страницы и много ссылок сайтов, чтобы использовать, не осуществимо, не говоря уже о том, что это выглядит странно, что URL имеет другой час, чем рекламируемый. Я попробовал это:
{% url event artist_slug=concert.slug_name hour=concert.datetime.hour|date:'H' %}
Без успеха тег фильтра даты не применяется, и возникает исключение. У меня довольно большая кодовая база и множество шаблонов, есть ли способ исправить это без использования аксессора, который возвращает дату и время?
Спасибо.
2 ответа
На самом деле документация Django гласит:
Даже если ваш веб-сайт доступен только в одном часовом поясе, все же рекомендуется хранить данные в формате UTC в вашей базе данных. Одной из основных причин является летнее время (DST). Во многих странах действует система перехода на летнее время, когда часы перемещаются вперед весной и назад осенью. Если вы работаете по местному времени, вы можете столкнуться с ошибками два раза в год, когда происходят переходы. (В документации по pytz эти вопросы обсуждаются более подробно.) Возможно, это не имеет значения для вашего блога, но это проблема, если вы переоцениваете или переоцениваете своих клиентов на один час, два раза в год, каждый год. Решением этой проблемы является использование UTC в коде и использование местного времени только при взаимодействии с конечными пользователями.
Более того:
Когда включена поддержка часовых поясов, Django использует объекты datetime с учетом часовых поясов. Если ваш код создает объекты даты и времени, они также должны знать об этом. В этом режиме приведенный выше пример становится:
import datetime
from django.utils.timezone import utc
now = datetime.datetime.utcnow().replace(tzinfo=utc)
Вывод информации о часовом поясе в шаблонах Когда вы включаете поддержку часового пояса, Django преобразует объекты даты и времени в текущий часовой пояс, когда они отображаются в шаблонах. Это ведет себя очень похоже на локализацию формата.
И, наконец, ничего не исправляя обезьяны: https://docs.djangoproject.com/en/1.6/topics/i18n/timezones/
К сожалению, единственный способ, который я нашел для работы с этим, - преобразовать дату в часовой пояс пользователя и предоставить собственный тег шаблона, чтобы получить нужный фрагмент, например:
{% url event artist_slug=concert.slug_name hour=concert.datetime|localtime|hour_of_day %}
Где hour_of_day - это пользовательский тег, возвращающий текущий час в правильном местном времени.