Python-使用时间戳进行日期和时间比较,定时

2024-05-07 13:50:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我花了一个小时研究Python文档和许多这样的问题;请原谅我是另一个被Python的时间差之谜困住的Python新手。

我的目标是确定当前时间和某个日期/时间之间的差异,而不考虑过去/将来,并返回一个可行的格式,如秒。

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

以下是我试过的。。。

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

  • 我偶然发现了这个神奇的timedelta函数,并探索了文档等等,但我不认为它能满足我的需求。

  • 我本来想把这两个时间戳都转换成从epoch开始的秒,然后再进行减法,但是如果减法的顺序不对(如果事件是在未来,则会出现不同的情况),这就成了一个问题,我想添加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?

但我不知道如何把这些点连起来。

我怎样才能做到这一点?


Tags: the函数文档datetimetime时间事件now
3条回答

几个月前我也有同样的问题。你要找的是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())))

这种方法有什么问题?

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

请注意,^{}仅在Python 2.7<;中可用,但根据文档:

Equivalent to (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6 computed with true division enabled.

结果完全一样。

你应该可以使用

tdelta.total_seconds()

为了得到你想要的价值。这是因为tdelta是一个^{}对象,这是datetime对象之间的任何区别。

几条注释:

  1. 使用strftime后跟strptime是多余的。您应该能够使用^{}获取当前日期时间。
  2. 类似地,使用time.ctime后跟strptime比需要的工作要多。您应该能够使用^{}获取另一个datetime对象。

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

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

相关问题 更多 >