Django не конвертирует дату и время, используя правильный часовой пояс - PullRequest
0 голосов
/ 24 мая 2019

Я изо всех сил пытаюсь выяснить, как работает часовой пояс в Джанго.В моих системах у меня есть все даты в UTC+00, даже с настройкой UTC+02 TIME_ZONE.

timezone.get_default_timezone()                                                                                                                                                                                                                                                                                                                   
<DstTzInfo 'Europe/Rome' RMT+0:50:00 STD>

timezone.get_current_timezone()                                                                                                                                                                                                                                                                                                                   
<DstTzInfo 'Europe/Rome' RMT+0:50:00 STD>

Я использую PostgreSQL в качестве базы данных и использую следующие настройки:

TIME_ZONE = 'Europe/Rome'
USE_TZ = True

Документация о PostgreSQL говорит:

... если вы используете PostgreSQL, вы можете свободно переключаться между USE_TZ = False и USE_TZ = True.Часовой пояс соединения с базой данных будет установлен на TIME_ZONE или UTC соответственно, так что Django получает правильные даты и времени во всех случаях.Вам не нужно выполнять какие-либо преобразования данных.

Если из оболочки я пытаюсь получить поле date_joined для пользователя, это UTC + 00 и не преобразуется в UTC + 02 (как и ожидалось, так как я использую TIME_ZONE)

admin.date_joined                                                                                                                                                                                                                                                                                                                                 
datetime.datetime(2017, 7, 12, 15, 22, 58, tzinfo=<UTC>)

str(admin.date_joined)                                                                                                                                                                                                                                                                                                                            
'2017-07-12 15:22:58+00:00'

Сериализованный объект (DRF) содержит ту же неправильную дату и время курса (в UTC + 00)

"date_joined": "2017-07-12T15:22:58Z",

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

Чего мне не хватает?где я ошибаюсь?

1 Ответ

1 голос
/ 24 мая 2019

Важно понимать, что datetimes конвертируются в текущий часовой пояс только тогда, когда "рендеринг" .То есть при использовании шаблонов, форм или, в случае Django Rest Framework, сериализаторов.

Часовой пояс объекта Python datetime зависит от соединения с базой данных и обычно составляет UTC.Одна из причин этого заключается в том, что часовые пояса - это, прежде всего, проблема отображения, поэтому не имеет значения, какой часовой пояс у вашего объекта Python.Более важной причиной является то, что преобразования часовых поясов потенциально являются потерями (поскольку во многих часовых поясах наблюдается неоднозначное время перехода на летнее время), поэтому вы действительно не хотите выполнять такого рода преобразования до самого последнего шага.

...