【问题标题】:How to get the seconds since epoch from the time + date output of gmtime()?如何从 gmtime() 的时间 + 日期输出中获取纪元以来的秒数?
【发布时间】:2011-05-31 17:24:56
【问题描述】:

你如何反向gmtime(),你把时间+日期放在哪里,得到秒数?

我有'Jul 9, 2009 @ 20:02:58 UTC' 之类的字符串,我想返回从纪元到 2009 年 7 月 9 日之间的秒数。

我尝试过time.strftime,但我不知道如何正确使用它,或者它是否是正确使用的命令。

【问题讨论】:

    标签: python datetime time


    【解决方案1】:

    使用time 模块:

    epoch_time = int(time.time())
    

    【讨论】:

    • @DanJ:它是自纪元以来经过的秒数(一个固定的时间点),在任何时区都是相同的。虽然如果我们忽略闰秒左右的时间实例;如果time 使用 Unix 纪元(1970),则很容易将其转换为 UTC。
    • 请注意,这不是 OP 所要求的,而是 想要的。所以+1。
    • 这是对标题中所问问题的答案:“获取自纪元以来的时间”。 +1
    • @J.F.Sebastian 这给了纪元秒。如何使用上述相同的答案将分辨率提高到毫秒?
    • 扩展my comment above:time.time() 值不依赖于本地时区(如果我们排除“正确”时区等),例如,如果它返回 POSIX 时间(因为它在大多数系统)然后它是自纪元(1970-01-01UTC)以来的 SI 秒数,不包括闰秒。此值可以转换为 UTC(不包括闰秒),但它不是 UTC。 @MarlonAbeykoon:我喜欢this answer
    【解决方案2】:

    如果您来到这里是因为搜索引擎告诉您这是获取 Unix 时间戳的方法,请停止阅读此答案。向上滚动一个。

    如果你想反转time.gmtime(),你需要calendar.timegm()

    >>> calendar.timegm(time.gmtime())
    1293581619.0
    

    你可以用time.strptime()把你的字符串变成一个时间元组,它返回一个时间元组,你可以把它传递给calendar.timegm()

    >>> import calendar
    >>> import time
    >>> calendar.timegm(time.strptime('Jul 9, 2009 @ 20:02:58 UTC', '%b %d, %Y @ %H:%M:%S UTC'))
    1247169778
    

    更多关于日历模块here

    【讨论】:

    • 如果您正在寻找当前的unix epoch时间请参考@DanJ的评论或naren的回答,这个回答是错误的!
    • 这样的答案让我发笑。我不确定为什么。我觉得自己像个篮球。
    • @NathanChappell 搜索引擎优化很奇怪,而“如何获得自纪元以来的秒数”是许多人阅读的问题的唯一部分。请参阅上面的评论,表明此答案不正确,因为它回答了实际提出的问题。
    • 如果你来这里只是为了寻找如何在 python 中获取纪元时间,答案是 -> time.time()
    【解决方案3】:

    请注意,time.gmtime 将时间戳 0 映射到 1970-1-1 00:00:00

    In [61]: import time       
    In [63]: time.gmtime(0)
    Out[63]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
    

    time.mktime(time.gmtime(0)) 为您提供一个时间戳,其偏移量取决于您的语言环境,通常可能不是 0。

    In [64]: time.mktime(time.gmtime(0))
    Out[64]: 18000.0
    

    time.gmtime 的倒数是calendar.timegm

    In [62]: import calendar    
    In [65]: calendar.timegm(time.gmtime(0))
    Out[65]: 0
    

    【讨论】:

    • 这为 time.mktime(考虑当前时区)提供了更好的解释和示例,谢谢
    • @Jkm:不要将mktime()gmtime() 一起使用。 mktime() 接受您的本地时间,但gmtime() 返回UTC 时间——您的本地时区可能并且很可能不同。 “相对于您的语言环境的时间戳”是无意义的:POSIX 时间戳不依赖于您的语言环境(本地时区)——它在世界各地都是相同的值。在大多数情况下(即使在 Windows 上),“自纪元以来的秒数”是 POSIX 时间戳——使用 TAI 时标的“正确”时区并不常见。见Does Python's time.time() return the local or UTC timestamp?
    • @J.F.塞巴斯蒂安 你是对的。实际上我最近遇到了一些关于mktime() 的问题。对于某些python web服务器(例如Tornado),由于进程一直在运行,即使我改变了系统区域设置,web服务器API调用的mktime()仍然使用旧时区来生成时间对象。我必须切换到 gmtime() 并手动应用 gmt 偏移量。
    【解决方案4】:
    ep = datetime.datetime(1970,1,1,0,0,0)
    x = (datetime.datetime.utcnow()- ep).total_seconds()
    

    这应该不同于int(time.time()),但使用x % (60*60*24)之类的东西是安全的

    datetime — Basic date and time types:

    与时间模块不同,日期时间模块不支持闰秒。

    【讨论】:

      【解决方案5】:
      t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")
      

      【讨论】:

      • 由于某种原因我无法访问 strptime。我已经导入了日期时间
      • @calccrypto 你必须要么from datetime import datetime要么做datetime.datetime.strptime
      【解决方案6】:

      有两种方法,具体取决于您的原始时间戳:

      mktime()timegm()

      http://docs.python.org/library/time.html

      【讨论】:

        猜你喜欢
        • 2011-10-24
        • 1970-01-01
        • 2021-07-03
        • 2013-11-02
        • 1970-01-01
        • 2017-01-15
        • 1970-01-01
        • 1970-01-01
        • 2011-08-31
        相关资源
        最近更新 更多