我想写一个django网站处理事件定时。我想要一个日历视图,在其中我可以显示与每天相关的事件。
我最初的研究建议最佳实践是将所有时间存储在UTC中,包括它们在数据库中的偏移量。我的问题是,如果我有两个事件:
- 事件
A
开始于2014-05-05 00:20:00+00:00
(刚好在零偏移时区的星期一午夜之后) - 事件
B
开始于2014-05-05 00:20:00+01:00
(刚好在星期一午夜之后,在一个小时的时差时区,因此就在零点之前,在一个零偏移时区,如UTC。)
我想查询所有从2014-05-05
开始的事件然后我做这样的查询:
monday_start = make_aware(datetime(2014, 5, 5), utc)
monday_end = make_aware(datetime(2014, 5, 6), utc)
events = EventInstance.objects.filter(
start_datetime__gte=monday_start,
start_datetime__lt=monday_end,
)
我只得到一个事件。理想情况下,我可以同时得到它们,因为它们都在各自时区的星期一。
如果我提供朴素的datetime对象,即。在日期时间上没有时区,对于查询,我从Django得到警告,仍然只得到一个结果。
问题:处理这种情况的最好方法是什么?
我觉得最好是不带偏移地存储所有时间,然后将事件的时区存储在单独的字段中,以便可以对原始时间进行查询,然后在必要时显示给用户使用的时区。但这可能有我无法预见的陷阱。
问题是您将UTC作为时区分配给monday_start和monday_end的定义。虽然事件B从它自己的角度开始于星期一,但它不是从UTC的角度开始的,而这正是过滤器要检查的。
为什么不使用朴素日期(没有时区信息)查询?
monday_start = datetime.combine(datetime(2014, 5, 5), datetime.min.time())
monday_end = datetime.combine(datetime(2014, 5, 5), datetime.max.time())
events = EventInstance.objects.filter(
start_datetime__gte=monday_start,
start_datetime__lt=monday_end,
)