认为
TIME_ZONE = 'UTC'
和 USE_TZ = True
现在我想按 2019-4-9 Honolulu 时间(用户时间)过滤
这是一个演示代码
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 个条目,但没有任何 react 。
如何获得这些条目,没有任何错误?
最佳答案
我认为这应该有效:
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 小时。
关于Django 过滤器 __date 时区感知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55607796/