Django过滤器__date具有时区意识 [英] Django filter __date with timezone aware
问题描述
假设
-
我正在使用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屋!