查询在特定日期开始的不同时区中的事件

时间:2014-05-08 09:48:41

标签: python django timezone

我正在尝试编写一个处理事件计时的django网站。我想要一个日历视图,我可以在其中显示与每一天相关的事件。

我的初步研究表明,最佳做法是将所有时间都存储在UTC中,包括它们在数据库中的偏移量。我的麻烦是,如果我有两个事件:

  1. 事件A2014-05-05 00:20:00+00:00开始(在零偏移时区的星期一午夜之后。)
  2. 事件B2014-05-05 00:20:00+01:00开始(就在星期一午夜之后的一小时偏移时区,因此就在午夜之前的零偏移时区,如UTC。)
  3. 我想查询从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的警告,但仍然只得到一个结果。

    问题:处理这种情况的最佳方法是什么?

    我觉得最好在没有偏移的情况下存储所有时间,然后将事件的时区存储在单独的字段中,以便可以根据原始时间进行查询,然后在必要时显示给用户的时区。但这可能有我无法预见的陷阱。

1 个答案:

答案 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,
)