我正在尝试编写一个处理事件计时的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,
)
我只收到一件事。理想情况下,我会同时获得两者,因为他们都是在周一的各个时区。
如果我提供天真的日期时间对象,即。在日期时没有时区,对于查询,我收到来自Django的警告,但仍然只得到一个结果。
问题:处理这种情况的最佳方法是什么?
我觉得最好在没有偏移的情况下存储所有时间,然后将事件的时区存储在单独的字段中,以便可以根据原始时间进行查询,然后在必要时显示给用户的时区。但这可能有我无法预见的陷阱。
答案 0 :(得分:0)
问题在于您将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,
)