2014-10-25 4 views
3

Django 1.7, PostgreSQL.Django и часовой пояс

Я хочу хранить дату и время в UTC и отображать его в часовом поясе PST.

Мой местное время: 8:05 утра

UTC Время: 1:05 утра

PST Время: 6:05 вечера

Джанго документ:

When support for time zones is enabled, Django stores date and time 
information in UTC in the database, uses time-zone-aware datetime objects 
internally, and translates them to the end user’s time zone in templates 
and forms. 

установка. py

USE_TZ = True 
TIME_ZONE = 'US/Pacific' 

Поле модели

created_at = models.DateTimeField(auto_now_add=True) 

Я создал новую модель, и в django admin она отображает время PST (6:05 pm). Все хорошо. Но если да, то:

select created_at from my_table where id = 1; 

Отображается мое местное время (8:05)! Итак, я не уверен, что это было сохранено в UTC.

И еще одно.

Обычная DateTime поле, я поставил в админ эту дату: 2014-10-25 18:00:00

Id отображается в админ 25 октября, 2014, 6 часов вечера

Но выбрать из БД показать мне:

2014-10- 08: 00: 00,0

Так, я определенно не понимаю, что происходит. Где моя ошибка?

+0

Как вы делаете 'select'? Возможно ли, что клиент, с которым вы работаете, конвертирует сохраненное время в свое местное время? –

+0

@KevinChristopherHenry Я выбираю с psql (программа командной строки postgres), я думаю, что это не делает преобразования времени. – Tom

ответ

5

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

Способ, которым я предпочитаю это делать, оставить часовой пояс базы данных без изменений, указать «UTC» в настройках django, а затем всякий раз отображая время для пользователя, используя некоторый javascript, преобразуйте его в локальное время.

Редактировать

не заметил до того, что вы используете PostgreSQL. Я думаю, вы можете просто изменить часовой пояс в postgresql.conf или изменить переменную TimeZone в UTC в базе данных

+1

[documentation] (https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#postgresql) подразумевает, что с 'USE_TZ = True', Django всегда будет хранить часовой пояс в UTC: Бэкэнд PostgreSQL хранит данные как временную метку с часовым поясом. На практике это означает, что он преобразует время от часового пояса соединения в UTC на хранение и от UTC к часовому поясу соединения при поиске ». Поэтому не нужно менять какие-либо настройки PostgreSQL. –

+0

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

0

Я думаю, что Алексей Кулешевич отвечает на первую часть вашего вопроса: когда вы делаете руководство select, PostgreSQL отображает метку времени в часовой пояс, настроенный в базе данных. Это не влияет на Django, хотя и ведет себя в соответствии с документацией.

Что касается второй части вашего вопроса: При вводе значения даты и времени в форме, Django интерпретирует его в текущем часовом поясе, который по умолчанию является таким же, как ваша настройка TIME_ZONE. Поэтому, когда вы вводите 18:00 в админ, Django интерпретирует это как 6 вечера PST и сохраняет его как 1 утра по UTC (на следующий день). Затем база данных отображает это как 8 утра по местному времени (на следующий день).

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