Python django时区:如何比较DST中两天之间的时差(以天为单位)

Python django时区:如何比较DST中两天之间的时差(以天为单位),python,django,timezone,Python,Django,Timezone,我目前正在使用django进行一个日历项目,该项目涉及一些时间计算,当我试图计算两个datetime对象之间的时间差时遇到了一个问题。当我创建时间时,我会: tz = timezone.get_default_timezone() curr_day = timezone.make_aware(datetime.datetime(curr_day.year, curr_day.month,

我目前正在使用django进行一个日历项目,该项目涉及一些时间计算,当我试图计算两个datetime对象之间的时间差时遇到了一个问题。当我创建时间时,我会:

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表示小时、分钟和秒

我的程序试图比较两个datetime在几天内的差值是否为1,所以我这样做了

if (event1 - event2).days == 1:
    # do something
当我尝试比较2017年12月3日和2017年13月3日(2017年12月3日是DST)时,问题出现了

event1
datetime.datetime(2017,3,13,4,0,tzinfo=)
事件2
datetime.datetime(2017,3,12,5,0,tzinfo=)
(事件1-2)天
0

我知道这是因为夏令时使差异小于一天,但我不知道解决方案,因为理论上结果也应该是1。如何修复代码以检测此问题?谢谢

在计算差值之前,您可以将小时、分钟、天设置回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。

什么是“一天”?是24小时吗?相关:@J.F.Sebastian:一天可能不一定是24小时,在我的程序中,它意味着两个datetime对象以小时、分钟、秒为单位相同,并且日期相差1。如果需要相同的小时、分钟,第二,但是差异可能小于/大于24小时,那么您可以使用在unrelated中计算昨天的算法:您可能应该使用
delta//timedelta(days=1)
(或者在较旧的Python版本上使用类似的算法)如果差异可能为负值,则使用
delta.days
。@J.F.Sebastian:使用
delta//timedelta(days=1)
有什么好处?我尝试过了,效果很好!但是我想知道你的“设置为0”的方式与我最初创建的“设置为0”的对象有什么不同?注意:
event1
event2
必须在同一时区,才能使结果有意义。我猜
event1
event2
已转换为其他时区,这就是小时数不再为零的原因。如果是这样,那么在您的代码中,转换前的小时数设置为零,而在我发布的代码中,转换后的小时数重置为零。@da_zhang:
event1
event2
的小时数不同(
4
5
)。原因可能是(必需)
tz.normalize()
在“设置为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