2011-01-26 8 views
11

ПРИМЕЧАНИЕ. Я удалил вопрос, как он существовал ранее, и предоставил только соответствующую информацию здесь.Django: выпуск часового пояса

Наш сервер базы данных (RH) имеет TIME_ZONE = «Европа/Лондон». И в параметрах Django settings.py мы указываем TIME_ZONE = «Америка/Новый_York».

И, в моем классе модели Я уточнял:

created = models.DateTimeField(editable=False,auto_now=False, auto_now_add=True) 
modified = models.DateTimeField(editable=False,auto_now=True, auto_now_add=True) 

Когда я затем смотреть на данные в сайте администратора, я получаю UTC время/GMT вместо Востока.

Я думал, что все время автоматически настраивается Django, поскольку я указал «America/New_York» как Часовой пояс Django.

Любая помощь/разъяснение оцениваются.

Благодаря Эрик

+0

что вы получаете от этого? >>> import datetime >>> datetime.datetime.now() –

+0

Я только что обновил информацию о SERVER. Часовой пояс установлен в On Server Europe/London. –

+0

Я предпочитаю не использовать AUTO_NOW. Он делегирует сервер базы данных, на котором должен быть установлен часовой пояс. Таким образом, вы теряете гибкость, чтобы пользователь мог использовать разные часовые пояса. –

ответ

10

Опираясь на дату/время, «автомагия» опасна, и эти параметры модели auto_add являются ловушкой. Всегда понимайте часовой пояс (ы), с которым имеете дело. Python делает это проще, добавив член tzinfo к своим объектам datetime. Хотя эти объекты по умолчанию являются «наивными», я рекомендую вам всегда прикреплять детали tzinfo. Тем не менее Python нуждается в дополнительной помощи либо с python-dateutil, либо pytz (что я использую). Вот универсальное правило: всегда сохраняйте свои данные в базе данных в формате UTC.

Почему? Ваши пользователи могут находиться в разных местных городах, мобильных телефонах и портативных компьютерах, серверы неправильно сконфигурированы или отражены в разных часовых поясах. Так много головных болей. Даты никогда не должны быть наивными, и если они (как в базе данных), и вам нужен контекст, также включайте в таблицу поле часового пояса.

Так что в вашем случае.

  1. Не используйте поля auto_now, вместо этого используйте custom save().
  2. Сохранять UTC в базе данных
  3. Если вам нужно знать часовой пояс - например, пользовательское событие - храните часовой пояс в базе данных.
  4. Преобразовать в нужной/запрошенной часовой пояс

Если вы используете pytz, метод localize() велик. Объект datetime для Python имеет полезные функции replace() и astimezone().

Еще одно замечание: если ваша база данных является наименее часовым поясом (например, MySQL), убедитесь, что ваши данные находятся в формате UTC, а затем используйте replace (tzinfo = None), поскольку соединитель базы данных не может обрабатывать объекты, поддерживающие tz.

Адрес thread с подробной информацией о полях auto_now Django.

0

Поскольку вы редактировали вопрос, я буду править мой ответ :) Django не может контролировать часовой пояс дб, поэтому способ исправить это обновить часовой пояс для БД , Для MySql, запустить этот запрос:

SELECT @@global.time_zone, @@session.time_zone;

Это должно вернуть SYSTEM, SYSTEM по умолчанию, что в вашем случае означает «Europe/London», и причину вашей проблемы. Теперь, когда вы убедились в этом, следуйте инструкциям в первом комментарии на этой странице:

http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

Не забудьте перезапустить сервер MySql после того как вы обновили часовой пояс для того, чтобы изменения вступили в силу.

+0

Пока DB хранит смещение часового пояса (не знаю о MySQL, но Postgres делает это с типом данных временной метки с часовым поясом), Django не должен заботиться о настройках БД - он должен просто выполнять математику. Несмотря на то, что Django считается справедливым DB-агностиком, желательно, Eric должен указать, какой сервер DB он запускает (имя и версия), что поможет отладки. – drdaeman

1

Когда вы говорите auto_now_add = True, значение будет добавлено сервером базы данных, а не вашим сервером django. Поэтому вам нужно установить часовой пояс на сервере базы данных.

3

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

Итак, позвольте мне спросить: зачем вам нужно время в EST, это для конечного пользователя, или вам нужно делать логику на сервере и нуждаться в ней в EST?

Если его для конечного пользователя, легкое исправление должно позволить обработчику браузера браузера преобразовать в нужное время. На сервере преобразования объекта DATETIME в метку времени:

timestamp = time.mktime(datetime_obj.timetuple()) * 1000 

А затем на веб-странице создания экземпляра объекта Date:

var date_obj = new Date({{ timestamp }}); 
var datetime_string = date_obj.toString(); 
// the datetime_string will be in the users local timezone 

Теперь, с другой стороны, если вы хотите иметь время в правильной зоне на сервере, чтобы вы могли выполнять на ней логику. Я рекомендую использовать с помощью python-dateutil. Это позволит вам легко переключиться на другой часовой пояс:

from datetime import datetime 
from dateutil import zoneinfo 

from_zone = zoneinfo.gettz('UTC') 
to_zone = zoneinfo.gettz('America/New_York') 

utc = created # your datetime object from the db 


# Tell the datetime object that it's in UTC time zone since 
# datetime objects are 'naive' by default 
utc = utc.replace(tzinfo=from_zone) 

# Convert time zone 
eastern_time = utc.aztimezone(to_zone) 

Теперь, если вы действительно хотите сохранить DateTime в EST, вам необходимо изменить время на сервере БД (например, Аджай Ядав и Gorus сказал). Я не знаю, почему вы хотите сохранить их как EST, но опять же я не знаю, что ваше приложение.

+0

Тодд, наверное, мой вопрос не был полным. Но я вижу ваши точки, и они хорошие. Я собираюсь использовать некоторые из ваших примеров в своем текущем проекте. Благодаря! –

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