如何从 gmtime() 的时间 + 日期输出中获取纪元以来的秒数?
Posted
技术标签:
【中文标题】如何从 gmtime() 的时间 + 日期输出中获取纪元以来的秒数?【英文标题】:How to get the seconds since epoch from the time + date output of gmtime()? 【发布时间】:2011-05-31 17:24:56 【问题描述】:你如何反向gmtime()
,你把时间+日期放在哪里,得到秒数?
我有'Jul 9, 2009 @ 20:02:58 UTC'
之类的字符串,我想返回从纪元到 2009 年 7 月 9 日之间的秒数。
我尝试过time.strftime
,但我不知道如何正确使用它,或者它是否是正确使用的命令。
【问题讨论】:
【参考方案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
【讨论】:
以上是关于如何从 gmtime() 的时间 + 日期输出中获取纪元以来的秒数?的主要内容,如果未能解决你的问题,请参考以下文章
Perl:从考虑夏令时的纪元开始以秒为单位输入时间时,获取 gmtime 和本地时间之间的偏移量
Python应用:求某文件夹的容量大小,有参数时按参数输出,无参数时按指定目录输出,数据不存在返回无结果