如何从 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() 的时间 + 日期输出中获取纪元以来的秒数?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JSON 数组数据输出中删除大括号 []?

time模块

Perl:从考虑夏令时的纪元开始以秒为单位输入时间时,获取 gmtime 和本地时间之间的偏移量

Python应用:求某文件夹的容量大小,有参数时按参数输出,无参数时按指定目录输出,数据不存在返回无结果

如何将日期时间从 PowerShell 输出转换为 yyyy-MM-dd HH:mm:ss 格式

Perl的timelocaltime和gmtime函数