Джанго: проблема часового пояса - PullRequest
11 голосов
/ 26 января 2011

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

На нашем сервере баз данных (RH) указано TIME_ZONE = "Europe / London". И в Django settings.py мы указываем TIME_ZONE = "America / New_York".

И, в моем классе Model я указал:

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.

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

Спасибо Eric

Ответы [ 4 ]

10 голосов
/ 08 февраля 2011

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

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

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

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

Если вы используете pytz, localize () метод отличный.У объекта datetime Python есть полезные replace () и astimezone ().

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

Вот поток с подробным описанием полей auto_now в Django.

3 голосов
/ 03 февраля 2011

Прежде всего, я хотел бы сохранить свои данные как 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)

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

1 голос
/ 02 февраля 2011

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

0 голосов
/ 27 января 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...