Django: выпуск часового пояса

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

Наш сервер базы данных (RH) имеет TIME_ZONE = "Европа/Лондон". И в параметрах Django settings.py мы указываем TIME_ZONE = "Америка/Новый_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.

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

Спасибо Эрик

Ответ 1

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

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

Итак, в вашем случае.

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

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

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

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

Ответ 2

Во-первых, я хочу сохранить свои данные в качестве 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 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, вам нужно изменить время на сервере БД (например, Ajay Yadav и gorus). Я не знаю, почему вы хотите сохранить их как EST, но опять же я не знаю, что ваше приложение.

Ответ 3

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

Ответ 4

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

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

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

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

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