pytz, Django 1.5 и postgres: проблемы с часовым поясом DST
Я создал сайт событий с Django 1.5.4 и postgres 9.1. Время только что изменилось для "отступления", и все данные даты / времени, введенные администраторами до изменения времени, теперь отстают на час.
В моих настройках Django у меня есть TIME_ZONE = 'America/Chicago'
а также USE_TZ = True
, Сайт событий предназначен для небольшого города в центральном часовом поясе США. Сервер и база данных также установлены для этого часового пояса. Просматривая базу данных, я могу сказать, какие события произошли до изменения, потому что все они говорят "-05" в конце, а те, которые введены после "-06". Хотя, насколько я понимаю, postgres должен сохранять временные метки как UTC, даже если он отображает их со смещением.
Чтобы отобразить данные, я вытаскиваю их из базы данных через ORM Джанго, затем использую astimezone
в дату начала каждого вхождения, вот так:
LOCAL_TZ = pytz.timezone(settings.TIME_ZONE)
def upcoming_week(start=None):
if not start:
start = date.today()
plus7 = start + timedelta(days=6)
occurs = models.Occurrence.objects.between(start, plus7) \
.select_related('event', 'event__location', 'event__priority')
return (start, plus7, occurs)
def upcoming_week_by_date(start=None):
start, plus7, occurs = upcoming_week()
_occurs_by_date = defaultdict(list)
for o in occurs:
dt = o.start.astimezone(LOCAL_TZ)
_occurs_by_date[dt.date()].append(o)
occurs_by_date = _occurs_by_date.items()
occurs_by_date.sort()
return (start, plus7, occurs_by_date)
Этот конкретный фрагмент кода используется для упорядочения событий по дате на домашней странице, и события всех дней, которые должны начинаться в полночь, теперь отображаются в предыдущий день. Время также отображается как "11 вечера", и это отрисовывается Django (не обработанный мной с помощью pytz).
У меня также есть код, который преобразует вхождения в json для использования в javascript и использует astimezone
так же, как и выше, и все события (созданные до изменения времени) также показывают на час раньше.
Я использую форк Eventtools здесь: https://github.com/FirelightWebware/glamkit-eventtools, и время показывает правильно в админке.
Обновление: только изменения, созданные до изменения времени и произошедшие после изменения времени, отключаются на час. Так что технически все работает правильно, так как они были созданы в другом часовом поясе, настройка имеет некоторый смысл. Таким образом, вопрос заключается в том, есть ли способ создать до изменения времени события, которые должны произойти после изменения времени, с правильным временем? На данный момент я должен сказать администраторам создавать только вхождения до изменения времени, а затем после изменения времени создавать больше вхождений. Что смешно.