Django рассматривая DateTimeField как UT C и Америку / Чикаго - PullRequest
0 голосов
/ 08 апреля 2020

В моем views.py я пишу и читаю из таблицы PostgreSQL, которая имеет DateTimeField.

При создании новой записи поле даты заполняется в UT C время. При извлечении данных из базы данных в views.py метка времени UT C обрабатывается так, как если бы она находилась в часовом поясе "Америка / Чика go".

# settings.py
TIME_ZONE = 'America/Chicago'
USE_I18N = True
USE_L10N = True
USE_TZ = True

Я пытался указать var ios даты с указанием часового пояса при создании записи в базе данных, но она всегда отображается как UT C при непосредственном просмотре базы данных. Когда я возвращаю данные, django обрабатывает дату и время UT C так, как если бы часовой пояс был "Америка / Чика go"

# views.py
    CT = pytz.timezone("America/Chicago")
    UTC = pytz.timezone("UTC")
    # attempt_1 = datetime.datetime.utcnow().astimezone(CT)
    # attempt_2 = datetime.datetime.now().astimezone(CT)
    # attempt_3 = datetime.datetime.utcnow()
    attempt_4 = datetime.datetime.utcnow().astimezone(UTC)
    new_entry = MyModel(date=attempt_4)
    new_entry.save()

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Проблема возникла из-за того, что мой DateTimeField определен в models.py следующим образом:

date=models.DateTimeField(auto_now_add=True)

При создании новой записи поле даты заполняется в UT C время, как и ожидалось, на основе документации здесь .

auto_now_add автоматически установит поле в настоящее время при первом создании объекта. Полезно для создания меток времени. Обратите внимание, что текущая дата всегда используется; это не просто значение по умолчанию, которое вы можете переопределить. Поэтому, даже если вы установите значение для этого поля при создании объекта, оно будет проигнорировано.

Если USE_TZ имеет значение True, это будет осведомленное значение даты и времени, представляющее текущее время в UT C. Обратите внимание, что now () всегда будет возвращать время в UT C независимо от значения TIME_ZONE; Вы можете использовать localtime (), чтобы получить время в текущем часовом поясе. is_aware (значение)

Я решил проблему, изменив TIME_ZONE = 'UTC' в settings.py. Хотя, судя по документации, вы также можете изменить models.py и определить дату без auto_now_add следующим образом:

date=models.DateTimeField()

0 голосов
/ 08 апреля 2020

Звучит так, как будто все работает так, как и должно быть в соответствии с Часовыми поясами Django Документация:

Когда включена поддержка часовых поясов, Django хранит информацию о дате и времени в UT C в базе данных, использует объекты datetime с учетом часового пояса и преобразует их в часовой пояс конечного пользователя в шаблонах и формах.

Вы должны использовать django модуль часового пояса для ваших дат.

from django.utils import timezone

now = timezone.now()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...