Python 存储和比较时间戳
根据我查到的信息,把时间戳存储为UTC时间(不是本地时间,完整格式,比如:2013-01-29 02:11:11.151996+00:00)是比较常见的做法。
在获取这些时间时,我想检查是否经过了一段时间。所以,
currentTime = datetime.utcnow()
storedTime = '2013-01-29 02:11:11.151996+00:00'
if (storedTime + 60) > currentTime:
print "60 or more has elapsed, do something again"
我该如何在UTC时间戳上加上任意的时间,即使它不是一个日期时间对象?或者,我该如何从UTC时间戳创建一个日期时间对象,然后再给它加上任意的时间。
我知道一旦我有了两个日期时间对象,我可以用 d1 > d2 来比较它们。我只是有点麻烦在获取这些对象的过程中。
谢谢大家!
编辑/更新:
谢谢大家。我决定采取以下做法:(这是两个答案的结合,抱歉我只能接受一个!)
lastTime = dateutil.parser.parse(subDict['last'])
utcNow = datetime.datetime.utcnow().replace(tzinfo=tz.tzutc())
if lastTime + datetime.timedelta(seconds=subDict['interval']) < utcNow:
print "Time elapsed, do something!"
2 个回答
3
在解析日期的时候,我喜欢用dateutil这个模块。对我来说,它比提到的strptime方法更简单、更干净(虽然后者也能用)。
import dateutil.parser
stored_time = dateutil.parser.parse('2013-01-29 02:11:11.151996+00:00')
不过,这只是简单的部分! :) 接下来你会遇到一些问题,尤其是在比较本地时间和带时区的时间值时。关于这个问题,StackOverflow上有很多讨论。你可以看看这个 链接里的答案。
4
把存储的时间设置为一个 datetime
对象,然后加上一个 timedelta
。strptime
是用来把字符串转换成 datetime 对象的:
(详细的格式字符串可以参考链接)
currentTime = datetime.datetime.utcnow()
s = '2013-01-29 02:11:11.151996+00:00'
storedTime = datetime.datetime.strptime(s[:-6], "%Y-%m-%d %H:%M:%S.%f")
if storedTime + datetime.timedelta(minutes=60) > currentTime:
print "stuff..."
注意:从 3.7 版本开始,增加了
.fromisoformat()
方法,所以对于isoformat()
的 datetime 字符串,不需要再使用strptime
了。
>>> datetime.datetime.fromisoformat('2013-01-29 02:11:11.151996+00:00')
datetime.datetime(2013, 1, 29, 2, 11, 11, 151996, tzinfo=datetime.timezone.utc)