Python - 日期&时间比较使用时间戳,timedelta

时间:2012-08-26 16:24:22

标签: python timedelta

过去一小时我一直在挖掘Python文档和许多SO问题;请原谅我是另一个被Python中时差之谜困住的Python新手。

我的目标是确定当前时间与特定日期/时间之间的差异,无论是在过去还是将来,并返回可行的格式,例如秒。

例如,如果输入是下午2:00和下午4:00(现在),我希望它说“-7200”,表示事件发生在AGO两小时。如果输入是下午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 whatever time unit I want the value of the entire difference?

但我对如何连接这些点感到迷茫。

我该如何做到这一点?

3 个答案:

答案 0 :(得分:27)

你应该可以使用

tdelta.total_seconds()

获取您正在寻找的价值。这是因为tdeltatimedelta对象,datetime个对象之间的差异也是如此。

几点说明:

  1. 使用strftime后跟strptime是多余的。您应该能够使用datetime.now获取当前日期时间。
  2. 同样,使用time.ctime后跟strptime比使用更多的工作。您应该可以使用datetime.fromtimestamp获取其他datetime对象。
  3. 所以,你的最终代码可能是

    now = datetime.now()
    then = datetime.fromtimestamp(os.path.getmtime("x.cache"))
    tdelta = now - then
    seconds = tdelta.total_seconds()
    

答案 1 :(得分:8)

这种方法有什么问题?

>>> 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使用真正的除法计算。

产生完全相同的结果。

答案 2 :(得分: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())))