Django过滤器__date具有时区意识 [英] Django filter __date with timezone aware

查看:86
本文介绍了Django过滤器__date具有时区意识的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设


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

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

I am recording data in Honolulu, Hawaii, which means 2019-4-9 9pm (user time) in Honolulu is 2019-4-10 in UTC (server time)

现在我想在2019-4-9檀香山时间(用户时间)之前进行过滤

Now I want to filter by 2019-4-9 Honolulu time (user time)

此处演示代码是什么

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

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

以下是TimelineTable中的数据(记录在 2019-4-9檀香山时间中)

Here is the data in TimelineTable (recorded in 2019-4-9 Honolulu time)

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

不考虑时区,获取数据就可以正常工作

Without considering timezone, fetch data works fine

>>> 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檀香山录制的条目。



Now the problem is with timezone.

I am talking to server: Hey, give me those entries I recorded in 2019-4-9 at Honolulu.

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

我希望有3个条目,但是什么也没发生。

I expected 3 entries, but nothing happens.

如何获取这些条目,而没有任何错误?

How to get these entries, without any bugs?

推荐答案

我认为这应该有效:

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

Explanation

When you generate datetime.datetime(2019, 4, 9), it will return time datetime.time(0, 0). When you convert it to UTC, the date won't be changed because its not the time difference between UTC and Honolulu is not 24 hours.

这篇关于Django过滤器__date具有时区意识的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆