2014-02-19 4 views
0

В настоящее время я работаю над проектом Django с DB постгерра. Данные, хранящиеся в db с отметкой времени с использованием наивного времени (локальное время пользователя). Однако в setting.py, мы имеемDjango Часовой пояс UTC

USE_TZ = True 

, что означает все временные отметки, извлекаемые Django ORM преобразуются в UTC.

Как правило, это нормально. Однако для функции, которую я создаю прямо сейчас, нужно время в реальном времени (местное время uesr). Конечно, я бы взял данные и преобразовал время в любое время, когда захочу, с двумя проблемами: 1. Я могу конвертировать временные метки в EST или что-то еще, но я до сих пор не знаю оригинального времени; 2. Я хочу сделать преобразование во время запроса ORM, а не после, так как оно будет более эффективным.

У кого-нибудь есть ключ к этому поводу? Спасибо заранее!

+0

В зависимости от вашего проекта может быть целесообразно преобразовать его в локальное время на клиенте (используя javascript) – goncalopp

+0

@goncalopp: Я имею дело с проблемой на стороне клиента. Я пытаюсь проанализировать таблицу журналов db (таблица журналов определяется мной). В журнале есть поле timestamps, которое записывает время, когда что-то произошло на стороне клиента. Я хочу это время, но django дает мне UTC. Я могу получить это время через psql или django raw query, но не django orm. Мне нужен способ конвертировать все время в исходное время, когда или до того, как я начну выполнять запрос orm. –

ответ

1

1) Если оригинальные даты действительно наивны, я бы предположил, что они были сохранены как любой часовой пояс, который вы установили в настройке TIME_ZONE (по умолчанию 'America/Chicago', но может быть что-то еще в вашем случае). Поэтому преобразование обратно в этот часовой пояс, вероятно, даст вам первоначальное время. Из Джанго документы:

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

(https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-TIME_ZONE)

Обычно информация временная зона фактически устанавливается на соединение с базой данных (https://docs.djangoproject.com/en/dev/ref/databases/#optimizing-postgresql-s-configuration), поэтому ожидается, что вы не получите DateTime в формате UTC при подключении к Postgres через PSQL с часового пояса используется по умолчанию для часовой пояс вашей системы, я не уверен, почему этого не происходит с необработанными запросами в django.

2) Я не могу сказать, что я провел много часов исследований, однако считаю, что установка USE_TZ рода обречений вам нужно преобразовать после запроса. Вы можете переопределить часовой пояс соединения, но я не знаю простого способа сделать это во время выполнения, поскольку он будет по умолчанию UTC из-за USE_TZ.

В предыдущих проектах я работал над и сталкивался с подобными проблемами, мы либо передали ответственность перед интерфейсом, как кто-то предложил в ваших комментариях (frontend возвращает UTC datetime и преобразует данные обратно из UTC), либо мы также сохранить часовой пояс пользователя и выполнить преобразование после запроса. Это не оказалось неэффективным в нашем случае использования.

+0

спасибо за ваш ответ. На самом деле я знаю, что вы говорите. Дело в том, что я пытаюсь выполнить запрос orm в таблице журналов и GROUP BY DAY, что и вызывает всю проблему. Поскольку концепция DAY в db определяется локальным временем пользователя, а не UTC.Однако, когда я пытаюсь группировать данные по дням, некоторые из них будут пересекать полуночью, а затем будут преобразованы django. Это причина, по которой я сказал, что хочу преобразовать время в исходную версию перед выполнением запроса orm. Есть ли какие-нибудь подсказки по этому поводу? –

+0

Я думаю, что вы можете использовать оператор AT TIME ZONE в SQL для группировки данных по дням, но вам, вероятно, придется обращаться к необработанным запросам, а не к orm. – Geekfish

+0

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

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