过去一小时我一直在挖掘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?
但我对如何连接这些点感到迷茫。
我该如何做到这一点?
答案 0 :(得分:27)
你应该可以使用
tdelta.total_seconds()
获取您正在寻找的价值。这是因为tdelta
是timedelta
对象,datetime
个对象之间的差异也是如此。
几点说明:
strftime
后跟strptime
是多余的。您应该能够使用datetime.now
获取当前日期时间。time.ctime
后跟strptime
比使用更多的工作。您应该可以使用datetime.fromtimestamp
获取其他datetime
对象。所以,你的最终代码可能是
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)
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())))