Python 存储和比较时间戳

1 投票
2 回答
11438 浏览
提问于 2025-04-17 14:00

根据我查到的信息,把时间戳存储为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 对象,然后加上一个 timedeltastrptime 是用来把字符串转换成 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)

撰写回答