Django时区:如何比较跨夏令时的两天之间的天数差异

4 投票
1 回答
1863 浏览
提问于 2025-04-18 18:26

我现在正在用Django做一个日历项目,里面涉及到一些时间计算。在计算两个日期时间对象之间的时间差时,我遇到了一个问题。当我创建时间的时候,我是这样做的:

tz = timezone.get_default_timezone()
curr_day = timezone.make_aware(datetime.datetime(curr_day.year,
                                                 curr_day.month,
                                                 curr_day.day,
                                                 0, 0, 0), tz)

在创建的时候,日期是最重要的,但因为这个对象要用日期时间(datetime),所以我加了三个0,分别代表小时、分钟和秒。

我的程序试图比较两个日期时间之间的天数差异是否为1,所以我这样做:

if (event1 - event2).days == 1:
    # do something

问题出现在我尝试比较2017年3月12日和2017年3月13日的时候(2017年3月12日是夏令时的开始)。

event1
datetime.datetime(2017, 3, 13, 4, 0, tzinfo=<UTC>)

event2
datetime.datetime(2017, 3, 12, 5, 0, tzinfo=<UTC>)

(event1-event2).days
0

我知道这是因为夏令时的原因,让它们之间的差异小于一天,但我不知道该怎么解决这个问题,因为理论上结果应该是1。我该如何修改我的代码来检测这个呢?谢谢!

1 个回答

4

你可以在计算时间差之前,把小时、分钟和天数都设为0:

In [79]: import datetime as DT
In [80]: (DT.datetime.combine(event1, DT.time(0)) - DT.datetime.combine(event2, DT.time(0))).days
Out[80]: 1

需要注意的是,根据这个“天”的定义,两个考虑时区的时间可能在一个时区下相差1天,而在另一个时区下却相差0天。

撰写回答