将timedelta转换为总秒数


185

我有时间差

time1 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
...
time2 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
diff = time2 - time1

现在,我如何找到经过的总秒数?diff.seconds不算数天。我可以:

diff.seconds + diff.days * 24 * 3600

有内置的方法吗?


8
@RestRisiko-你是对的。仍然,有关于Stack Overflow的问题很有用,因此下次我或其他人(对于Google)对此问题的回答时,他得到了很好的回答,这是最好的结果。
ripper234 2011年

稍后我们将讨论“好”的替代定义。请在逃跑之前阅读我的回答:)
John Machin

计算time1diff您的代码中存在多个问题。要将当前utc时间作为朴素的datetime对象获取,请datetime.utcnow()改用。要了解为什么您应该使用UTC而不是本地时间来查找时差,请参见“ 查找日期时间之间是否经过了24小时-Python”time.monotonic()最好查找事件之间的经过时间(而不是time.time()datetime.utcnow())。
jfs 2015年

Answers:



8

您的一个或另一个问题 datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))表达。

(1)如果您所需要的只是两秒之间的差异,那么就很简单time.time()

(2)如果您将这些时间戳记用于其他目的,则需要考虑您在做什么,因为结果在整个过程中都有很大的气味:

gmtime()UTC返回一个时间元组,但是mktime()期望以本地时间为时间元组

我在澳大利亚的墨尔本,标准TZ是UTC + 10,但是夏令时仍然有效,直到明天早上,所以是UTC + 11。当我执行以下命令时,这是当地时间2011-04-02T20:31 ... UTC是2011-04-02T09:31

>>> import time, datetime
>>> t1 = time.gmtime()
>>> t2 = time.mktime(t1)
>>> t3 = datetime.datetime.fromtimestamp(t2)
>>> print t0
1301735358.78
>>> print t1
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=9, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=0) ### this is UTC
>>> print t2
1301700663.0
>>> print t3
2011-04-02 10:31:03 ### this is UTC+1
>>> tt = time.time(); print tt
1301736663.88
>>> print datetime.datetime.now()
2011-04-02 20:31:03.882000 ### UTC+11, my local time
>>> print datetime.datetime(1970,1,1) + datetime.timedelta(seconds=tt)
2011-04-02 09:31:03.880000 ### UTC
>>> print time.localtime()
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=20, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=1) ### UTC+11, my local time

您会注意到,t3表达式的结果是UTC + 1,这似乎是UTC +(我的本地DST差异)……不是很有意义。您应该考虑使用datetime.datetime.utcnow()DST开启/关闭时不会跳一个小时的方法,它可能会比time.time()


感谢您的澄清。出于我现在使用的目的,有时甚至不超过几个小时的差异并不重要,但是我一定会在以后写更有意义的文章时加以检查。
ripper234 2011年

-7

您可以使用mx.DateTime模块

import mx.DateTime as mt

t1 = mt.now() 
t2 = mt.now()
print int((t2-t1).seconds)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.