Фильтр Django __date с учетом часового пояса - PullRequest
2 голосов
/ 10 апреля 2019

Предположим,

  1. Я использую Django 2.x и использую настройки по умолчанию.то есть TIME_ZONE = 'UTC' и USE_TZ = True

  2. Я записываю данные в Гонолулу, Гавайи, что означает 2019-4-9 9 вечера (пользовательское время) в Гонолулу 2019-4-10в UTC (серверное время)

Теперь я хочу отфильтровать по 2019-4-9 гг. время Гонолулу (пользовательское время)

Вот какой демонстрационный код

class TimelineTable(models.Model):
    accessed = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'{self.accessed}'

Вот данные в TimelineTable (записанные в 2019-4-9 по Гонолулу )

ID      accessed       
1       2019-04-10 07:19:30.319881 
2       2019-04-10 07:19:35.004506
3       2019-04-10 07:19:37.612088

Без учета часового пояса, выборка данных работает нормально

>>> TimelineTable.objects.filter(accessed__date=datetime.date(2019, 4, 9))
<QuerySet []>
>>> TimelineTable.objects.filter(accessed__date=datetime.date(2019, 4, 10))
<QuerySet [<TimelineTable: 2019-04-10 07:19:30.319881+00:00>, <TimelineTable: 2019-04-10 07:19:35.004506+00:00>, <TimelineTable: 2019-04-10 07:19:37.612088+00:00>]>

Теперь проблема в часовом поясе.

Я говорю с сервером: Эй, дайте мне записи, которые я записал в Гонолулу в 2019-4-9 годах.

>>> Honolulu = pytz.timezone("Pacific/Honolulu")
>>> t = datetime.datetime(2019, 4, 9, tzinfo=Honolulu)
>>> TimelineTable.objects.filter(accessed__date=t)
<QuerySet []>

Я ожидал 3 записи, но ничего не происходит.

Как получить эти записи, без каких-либо ошибок?

1 Ответ

1 голос
/ 10 апреля 2019

Я думаю, что это должно работать:

t = datetime.datetime(2019, 4, 9, 14, 00, 00, tzinfo=Honolulu)
d = t.astimezone(pytz.UTC)
TimelineTable.objects.filter(accessed__date=d.date())
# OR 
TimelineTable.objects.filter(accessed__gte=t)

Следующий код будет не работать:

t = datetime.datetime(2019, 4, 9, tzinfo=Honolulu)
d = t.astimezone(pytz.UTC)
TimelineTable.objects.filter(accessed__date=d.date())

Объяснение

Когда вы генерируете datetime.datetime(2019, 4, 9), он вернет время datetime.time(0, 0). Когда вы конвертируете его в UTC, дата не изменится, потому что разница во времени между UTC и Гонолулу не составляет 24 часа.

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