2013-07-03 2 views
4

У меня есть модель под названием Vote с полем date:Python/Django MySQL обработки Datetime и часовой пояс

date = models.DateTimeField(auto_now_add=True) 

Когда я добавить элемент, дата в MySQL является дата UTC, но я живу в UTC +2 часовой пояс

Я думаю, что я правильно установить часовой пояс в settings.py:

TIME_ZONE = 'Europe/Paris' 

Python использовать правильный часовой пояс:

>>> print datetime.datetime.now() 
2013-07-03 09:05:04.474000 

MySQL тоже:

> SELECT NOW() 
2013-07-03 09:00:48 

Я мог бы установить атрибут даты Мануалы, он работает, но я хотел бы знать, почему auto_now_add возвращает неправильную дату хотя и питона и MySQL использовать правильный часовой пояс,

Спасибо

ответ

9

Это сложная привязка для объяснения. Из Django 1.4,

Когда USE_TZ ложна, это часовой пояс, в котором Django будет хранить все DateTimes. Когда USE_TZ имеет значение True, этот является часовым поясом по умолчанию, который Django будет использовать для отображения данных в шаблонах и для интерпретации данных, вводимых в формы.

это относится к TIME_ZONE. Итак, каков ваш USE_TZ? Если ваш USE_TZ имеет значение True, Django будет хранить дату и время в UTC и использовать TIME_ZONE для отображения в шаблонах и интерпретации форм.

Это потому, что если вы измените свой TIME_ZONE позже, разместив свой сайт на другой территории, легко конвертировать любые даты с UTC в любые заданные временные интервалы.

В Django 1.3 и ранее,

Обратите внимание, что это часовой пояс, к которому Django преобразует все даты/времени - не обязательно часовой пояс сервера. Например, один сервер может обслуживать несколько сайтов на основе Django, каждый из которых имеет отдельную настройку временной зоны .

Обычно Django устанавливает переменную os.environ ['TZ'] в часовой пояс , указанный вами в настройке TIME_ZONE. Таким образом, все ваши взгляды и модели будут автоматически работать в правильном часовом поясе.

Но не сообщите вам, в какой часовой пояс дата и время будут храниться в базе данных. Нужно поэкспериментировать в любом случае (моя догадка - UTC).

print datetime.datetime.now() печатает данные в соответствии с настройкой часового пояса вашего сервера, если вы не открыли консоль python через manage.py shell.

То же самое касается консоли MySQL. Он показывает время в вашем часовом поясе машины, а не то, что хранится в базе данных, если я прав.

+0

У меня USE_TZ установлено значение True, я предпочитаю хранить дату в локальном часовом поясе, поэтому я устанавливаю USE_TZ в False, и это работает! Спасибо –

+1

Пожалуйста, помните, что если вы установите его на «False», вы будете испытывать сильную боль при локализации своего приложения. Я бы предпочел сохранить его в UTC и написать промежуточное программное обеспечение, чтобы установить тембр для текущего запроса. Если у вас есть время, потратьте немного средств на исследование этого http://stackoverflow.com/questions/15065338/django-timezone-localization-not-working-as-expected :) – Babu

+0

Хорошо, мое приложение не должно быть локализовано. Но я помню это для следующего разработчика. Спасибо, очень полезный комментарий –

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