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 после того, как вы обновили часовой пояс, чтобы изменения вступили в силу.