如何从gmtime()的时间+日期输出获取自纪元以来的秒数?


162

你如何做相反gmtime(),你把时间+日期,并获得秒数?

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

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

Answers:


123

如果您是由于搜索引擎告诉您这是获取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

有关日历模块的更多信息,请点击此处


16
如果您正在寻找当前的Unix纪元时间,请参阅@DanJ的评论或naren的答案,此答案不正确!
kosii 2013年

637

使用时间模块:

epoch_time = int(time.time())

14
@DanJ:它是从Epoch(固定时间)开始经过的秒数,在任何时区都相同。虽然如果我们忽略leap秒左右的时间实例,如果time使用Unix纪元(1970),很容易将其转换为UTC 。
jfs

42
请注意,这不是OP的要求,而是想要的。所以+1。
fearless_fool14年

6
这就是标题中要求的答案:“从纪元开始计时”。+1
AlejandroVD

@JFSebastian这给纪元秒。如何使用上述相同答案将分辨率提高到毫秒级?
马隆·阿比库恩

2
上面扩展我的评论time.time()值不依赖于本地时区(如果我们排除“正确的”时区等),例如,如果它返回POSIX时间(与大多数系统一样),则是自大纪元(1970-01-01UTC)不计算leap秒。此值可以转换为UTC(不包括leap秒),但不能转换为UTC。@MarlonAbeykoon:我喜欢这个答案
jfs

10

请注意,time.gmtime将时间戳映射01970-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.gmtimecalendar.timegm

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

这为time.mktime(考虑了当前时区)提供了更好的解释和示例,谢谢
Jkm

@Jkm:请勿mktime()与一起使用gmtime()mktime()接受您的当地时间,gmtime()返回UTC时间 -您的当地时区可能而且可能会不同。“相对于您的语言环境的时间戳”是没有意义的:POSIX时间戳并不取决于您的语言环境(本地时区),在世界范围内都是相同的值。在大多数情况下(即使在Windows上),“自纪元以来的秒数”也是POSIX时间戳-使用TAI时标的“正确”时区之类的情况并不常见。请参阅Python的time.time()是否返回本地或UTC时间戳?
jfs

@JF塞巴斯蒂安你是对的。实际上我mktime()最近有一些问题。对于某些python Web服务器(例如,Tornado),由于进程继续运行,即使我更改了系统区域设置,mktime()Web服务器API调用的仍然使用旧时区来生成时间对象。我必须切换到gmtime()并手动应用gmt偏移量。
Jkm

5
ep = datetime.datetime(1970,1,1,0,0,0)
x = (datetime.datetime.utcnow()- ep).total_seconds()

这应该与有所不同int(time.time()),但是可以安全地使用类似x % (60*60*24)

datetime-基本日期和时间类型:

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


3
t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")

由于某种原因,我无法访问strptime。我已导入日期时间
calccrypto

1
@calccrypto您必须执行from datetime import datetime或执行datetime.datetime.strptime
pathikrit

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.