2016-03-15 4 views
2

У меня есть приложение Django, которое сильно взаимодействует с другими устаревшими базами данных. Эти другие базы данных используют локальное время, а не UTC. Я понимаю поддержку часового пояса Django, а также рекомендацию всегда использовать время UTC, кроме как взаимодействуя с пользователем. В этом случае мне действительно нужно, чтобы Django дал мне системную дату/время.Получить местное системное время в Django

В settings.py У меня есть

USE_TZ = False 

И когда я бегу date из командной строки Linux я (к примеру):

Tue Mar 15 17:03:42 MDT 2016 

Кроме того, когда я открываю регулярно (не Джанго) питон оболочки и запустить

import datetime 
str(datetime.datetime.now()) 

Я получаю

'2016-03-15 17:04:55.182283' 

Но когда я запускаю одни и те же команды из Django оболочки (python manage.py shell) я получаю время один час раньше:

'2016-03-15 16:07:10.949269' 

Есть ли какой-нибудь способ, что я могу получить объект типа DateTime, который имеет точно системное время , игнорируя любую магию часового пояса?

+0

Возможно, я неправильно понял ваш запрос, но не можете ли вы просто использовать time.time() для получения системного времени? –

+0

Я думаю, что мое использование системного времени неверно, извинения. Я имею в виду, что когда в моем часовом поясе уже 5 вечера, как обычная оболочка python, так и системная команда «date» говорят мне, что это 5 вечера, но в оболочке Django я получаю 4 вечера. Надеюсь, это имеет смысл. – user1309114

ответ

8

Вы хотели бы использовать django.utils.timezone, а именно:

from django.utils.timezone import localtime, now 

# get now datetime based upon django settings.py TZ_INFO 
localtime(now()) 
+0

Я нашел еще один способ обойти это, но только для того, чтобы следовать, это не сработало в моем случае. Возможно, если бы я включил 'USE_TZ' для Django, но когда я запустил код выше, я получаю:' ValueError: astimezone() не может быть применено к наивному datetime' («Другой путь вокруг этого» в основном просто не полагаться на время, предоставленное приложением django, не нашел способа получить django, чтобы дать мне подходящее время.) – user1309114

0

От django docs:

How do I interact with a database that stores datetimes in local time?

Set the TIME_ZONE option to the appropriate time zone for this database in the DATABASES setting.

This is useful for connecting to a database that doesn’t support time zones and that isn’t managed by Django when USE_TZ is True.

Установите USE_TZ=True так, что Джанго будет использовать часовой пояс-зависимые объекты даты-времени внутри.

Установить TIME_ZONE в настройках DATABASES, чтобы разместить устаревшие базы данных. Django будет конвертировать DateTimes в соответствующем часовой пояс автоматически, т.е., чтобы получить текущее время, достаточно:

from django.utils import timezone 

now = timezone.now() 

Примечания: datetime.now() возвращает наивный объект DateTime. Не используйте его.

+0

Я тоже пробовал это, даже с правильным набором часового пояса. Я все еще получаю время, которое является одним час до того, что я получаю из оболочки не-django python, используя datetime.now(). То, что я действительно хочу в этом случае, - это наивный объект datetime, и я думаю, мне также очень интересно, почему оболочка django делает что-то другое с datetime.now() (с USE_TZ выключено), чем обычная оболочка python. – user1309114

+0

Я должен добавить - я не просто хочу добавить/прочитать время из старой базы данных, мне также нужно сравнить записи из этой базы данных с текущим временем.Например, мне нужно загрузить объекты из базы данных, созданные за последние десять минут. Если я не могу получить объект datetime, соответствующий часовому поясу устаревшей базы данных, тогда я не могу обработать запрос, который надежно дает мне объекты за последние X минут. – user1309114

+0

@ user1309114: 1- Вы не ошибаетесь в db? Или вы только что напечатали 'timezone.now()' и решили, что это неправильно? 2, вы не должны использовать 'datetime.now()', и поэтому его значение не имеет значения 3, как я уже сказал: django автоматически преобразует ваши объекты времени и времени, например, для получения X минут в прошлом: 'dt = timezone.now() - timedelta (minutes = X) '. Если вы передадите это значение в db; он должен быть преобразован в часовой пояс TIME_ZONE. – jfs