我有时差

import time
import datetime

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

现在,我怎么求出经过的总秒数?迪夫,秒不算天。我可以这样做:

diff.seconds + diff.days * 24 * 3600

有内置的方法吗?


当前回答

您的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-02 t9: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()提供更高的精度。

其他回答

获取两个datetime对象之间的差异,然后将差异转换为秒的更紧凑的方法如下所示(Python 3x):

from datetime import datetime
        
time1 = datetime.strftime('18 01 2021', '%d %m %Y')
    
time2 = datetime.strftime('19 01 2021', '%d %m %Y')

difference = time2 - time1

difference_in_seconds = difference.total_seconds()

你可以用mx。DateTime模块

import mx.DateTime as mt

t1 = mt.now() 
t2 = mt.now()
print int((t2-t1).seconds)

您的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-02 t9: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()提供更高的精度。

使用timedelta.total_seconds()。

>>> import datetime
>>> datetime.timedelta(seconds=24*60*60).total_seconds()
86400.0