Python timedelta在减法中的表现

12 投票
1 回答
8939 浏览
提问于 2025-04-16 23:46

这个问题的起源是我在看到一个关于Python的datetimetimedelta对象的讨论时,产生了疑问。

我跟着jimgardener的更新,阅读了eyquem的评论,并尝试了一些Python代码……但由于我对Python还不太熟悉,所以对这里的工作原理有些搞不懂……我觉得有必要问一个新问题。

import datetime
#for t1=23:30:00 PM
t1 = datetime.time(23,30,00)

#for t1=00:15:30 AM
t2 = datetime.time(0,15,30)

td1 = datetime.timedelta(hours=t1.hour,minutes = t1.minute,seconds=t1.second)

td2 = datetime.timedelta(hours=t2.hour,minutes = t2.minute,seconds=t2.second)

#substarcting timedeltas
tdiff = td2-td1

打印这些变量的结果是

td1 ==> datetime.timedelta(0, 84600)
td1.seconds ==> 84600

td2 ==> datetime.timedelta(0, 930)
td2.seconds ==> 930

tdiff ==> datetime.timedelta(-1, 2730)

当我查看这些结果时,我注意到

td1.seconds (ie 84600) is equivalent to 
84600/60 ==> 1410 minutes
1410/60 ==> 23.5 hours
or in short,td1 represents the duration **from previous midnight** to 23:30 PM

现在,

td2.seconds (ie 930) is equivalent to
930/60 ==> 15.5 minutes or 15 minutes and 30 seconds
which means td2 represents the duration from **that midnight**
 to 00:15:30 AM

当检查tdiff时,我发现

tdiff ==> timedelta(-1,2730)
tdiff.seconds ==> 2730
tdiff.seconds/60 ==>45 minutes

这和t1(23:30:00 PM)和t2(00:15:30 AM)之间的持续时间是一样的,假设t2在t1之后

我的问题是,既然td1是从前一天的午夜到23:30:00 PM的持续时间,而td2是从那天的午夜到00:15:30 AM的持续时间,那么它们的差值怎么能代表t2和t1之间的持续时间呢?

能不能请一些Python高手来解释一下?

1 个回答

12

timedelta 代表的不是从午夜开始的时间,而是一个时间的长度

如果我做某件事情花了三小时,然后又减去四小时,那么结果就是负一小时

这两个 timedelta 之间的差就是负一天加上45分钟

这和负23小时15分钟是一样的。

15分钟减去23小时30分钟的结果是负23小时15分钟

撰写回答