Джанго и часовой пояс

Джанго 1.7, PostgreSQL.

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

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

UTC-время: 1:05.

Время по тихоокеанскому времени: 18: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 она отображает время PST (18:05). Все хорошо. Но если я сделаю:

select created_at from my_table where id = 1;

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

И еще кое-что.

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

Идентификатор отображается в панели администратора 25 октября 2014 г., 18:00.

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

2014-10-26 08:00:00.0

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


person Tom    schedule 25.10.2014    source источник


Ответы (2)


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

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

Изменить

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

person lehins    schedule 25.10.2014
comment
документация подразумевает, что с USE_TZ = True Django всегда будет хранить часовой пояс в формате UTC: серверная часть PostgreSQL хранит дату и время в виде метки времени с часовым поясом. На практике это означает, что он преобразует дату и время из часового пояса соединения в UTC при хранении и из UTC в часовой пояс соединения при извлечении. Поэтому нет необходимости изменять какие-либо настройки PostgreSQL. - person Kevin Christopher Henry; 25.10.2014
comment
На самом деле я сказал это неправильно, он сохраняет отметку времени, но всякий раз, когда вы делаете запрос, он будет отображать время, используя часовой пояс, указанный в настройках базы данных. Вот почему вам придется изменить настройку, чтобы увидеть часовой пояс UTC. - person lehins; 25.10.2014

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

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

person Kevin Christopher Henry    schedule 25.10.2014