Django过滤器__date具有时区意识

时间:2019-04-10 08:15:28

标签: django datetime timezone

假设

  1. 我正在使用Django 2.x,并使用默认设置。即TIME_ZONE = 'UTC'USE_TZ = True

  2. 我正在夏威夷檀香山记录数据,这意味着檀香山的2019-4-9 9pm(用户时间)是UTC的2019-4-10(服务器时间)

现在我想在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 个答案:

答案 0 :(得分:1)

我认为这应该可行:

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小时。