查询从某一天开始的不同时区的事件



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

我最初的研究建议最佳实践是将所有时间存储在UTC中,包括它们在数据库中的偏移量。我的问题是,如果我有两个事件:

  1. 事件A开始于2014-05-05 00:20:00+00:00(刚好在零偏移时区的星期一午夜之后)
  2. 事件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,
)

最新更新