22

在过去的一个小时里,我一直在研究 Python 文档和许多 SO 问题;请原谅我是另一个被 Python 时差之谜所困的 Python 新手。

我的目标是确定当前时间和某个日期/时间之间的差异,无论是在过去/未来,并返回一个可行的格式,例如秒。

例如,如果输入是下午 2:00 和下午 4:00(现在),我希望它说“-7200”,表示事件发生在两小时前。如果输入是周五下午 4:00(现在)和周日下午 5:00,则输出应该是“176400”秒,表示从现在开始的两天零一小时。

这是我尝试过的事情...

  • 我的第一个版本是一个函数,它采用字符串时间戳并将其拼凑成多个变量,然后将它们进行比较。它很笨重,有很多错误,我想如果我把它贴在这里我会负责程序员的吐槽。

  • 我偶然发现了这个神奇的 timedelta 函数并探索了文档和 SO,但我不认为它符合我的要求。

  • 我的想法是将两个时间戳转换为自纪元以来的秒数,然后减去,但如果减法的顺序错误(如果事件在未来,则情况不同),这会成为一个问题,我想添加 if 语句来检查秒的符号会很笨重,需要避免。

这是我当前的代码(仍然需要修复“双向”比较),来自先前解决的 SO 问题:

now = time.strftime("%a %b %d %H:%M:%S %Y")
then = time.ctime(os.path.getmtime("x.cache"))
tdelta = datetime.strptime(now, '%a %b %d %H:%M:%S %Y') - datetime.strptime(then, '%a %b %d %H:%M:%S %Y')

而且我觉得我应该能够以某种方式从中提取秒数,就像在这个问题中一样: Python's timedelta: Can't I just get in any time unit I want the value of the entire Difference?

但我不知道如何连接这些点。

我怎样才能做到这一点?

4

3 回答 3

35

你应该可以使用

tdelta.total_seconds()

获得您正在寻找的价值。这是因为tdelta它是一个timedelta对象,对象之间的任何差异也是如此datetime

几点注意事项:

  1. 使用strftime其次strptime是多余的。您应该能够使用datetime.now.
  2. 同样,使用time.ctime后跟strptime是比需要更多的工作。您应该能够datetime使用datetime.fromtimestamp.

所以,你的最终代码可能是

now = datetime.now()
then = datetime.fromtimestamp(os.path.getmtime("x.cache"))
tdelta = now - then
seconds = tdelta.total_seconds()
于 2012-08-26T16:28:05.703 回答
10

这种方法有什么问题?

>>> from datetime import datetime
>>> a = datetime.now()
>>> b = datetime.now() # after a few seconds
>>> delta = a-b
>>> delta.total_seconds()
-6.655989

请注意,total_seconds仅在 Python 2.7 < 中可用,但根据文档是:

等效于 (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6在启用真正除法的情况下计算。

这会产生完全相同的结果。

于 2012-08-26T16:28:36.537 回答
2

几个月前我遇到了同样的问题。您正在寻找的是 datetime.timedelta 和 datetime.datetime.fromtimestamp()。这是一个如何使用它们来解决您的问题的示例。

import datetime
import time
t1 = time.time()
#do something to kill time or get t2 from somewhere
a = [i for i in range(1000)]
t2 = time.time()
#get the difference as datetime.timedelta object
diff=(datetime.datetime.fromtimestamp(t1) - datetime.datetime.fromtimestamp(t2))
#diff is negative as t2 is in the future compared to t2
print('difference is {0} seconds'.format(abs(diff.total_seconds())))
于 2012-08-26T17:02:41.657 回答