How to get the seconds since epoch from the time + date output of gmtime()?
你如何将时间+日期和秒数倒过来?
我有类似于'Jul 9, 2009 @ 20:02:58 UTC'的字符串,我想返回从新纪元到2009年7月9日的秒数。
我试过time.strftime,但我不知道如何正确地使用它,或者它是否是正确的命令。
使用时间模块:
1
| epoch_time = int(time.time()) |
- 这是UTC,因此我觉得它更正确
- @丹杰:这是从新纪元(时间上的固定时刻)以来经过的秒数,在任何时区都是相同的。不过,如果忽略闰秒左右的时间实例,那么很容易将其转换为UTC,如果time使用unix epoch(1970)。
- 注意,这不是OP要求的,但这是我想要的。那么+1。
- 这是对标题"从新纪元开始获得时间"的回答。+ 1
- @J.F.塞巴斯蒂安这给了时代以秒。如何使用上述相同的答案获得高达毫秒的分辨率?
- 好的,我发现int(round(time.time()*1000))以毫秒为单位。
- 扩展我在上面的评论:time.time()值不依赖于本地时区(如果我们排除"正确"时区等),例如,如果它返回posix时间(就像在大多数系统上那样),那么它是自epoch(1970-01-01utc)以来不计算闰秒的si秒数。此值可以转换为UTC(不包括闰秒),但它不是UTC。@我喜欢这个答案
你要的是calendar.timegm()。
1 2
| >>> calendar.timegm(time.gmtime())
1293581619.0 |
您可以使用time.strptime()将字符串转换为时间元组,它返回一个可以传递给calendar.timegm()的时间元组:
1 2 3 4
| >>> import calendar
>>> import time
>>> calendar.timegm(time.strptime('Jul 9, 2009 @ 20:02:58 UTC', '%b %d, %Y @ %H:%M:%S UTC'))
1247169778 |
此处显示有关日历模块的详细信息
- 如果您要查找当前的Unix Epoch时间,请参阅@danj's comment或naren's answer,此答案不正确!
- @kosii:答案(在当前格式中,在编辑之后)是正确的:输入是一个时间字符串(在UTC中),您可以使用返回posix时间戳的time.strptime()轻松地分析它。
注意,time.gmtime将时间戳0映射到1970-1-1 00:00:00。
1 2 3
| 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。
1 2
| In [64]: time.mktime(time.gmtime(0))
Out[64]: 18000.0 |
time.gmtime的倒数为calendar.timegm:
1 2 3
| In [62]: import calendar
In [65]: calendar.timegm(time.gmtime(0))
Out[65]: 0 |
- 这为time.mktime(考虑到当前时区)提供了更好的解释和示例,谢谢。
- @JKM:不要将mktime()与gmtime()一起使用。mktime()接受您的本地时间,但gmtime()返回UTC时间—您的本地时区可能不同,也可能不同。""相对于您的区域设置的时间戳"是没有意义的:POSIX时间戳不依赖于您的区域设置(本地时区)——它在世界各地都是相同的值。自epoch以来的秒数在大多数情况下(甚至在Windows上)是posix时间戳——像"正确的"时区这样使用tai时间尺度的情况并不常见。请参见python的time.time()是否返回本地或UTC时间戳?
- @J.F.塞巴斯蒂安,你说得对。实际上,我最近有一些关于mktime()的问题。对于某些Python Web服务器(例如Tornado),由于进程一直在运行,即使我更改了系统区域设置,Web服务器API调用的mktime()仍然使用旧时区生成时间对象。我必须切换到gmtime()并手动应用gmt偏移量。
1 2
| ep = datetime.datetime(1970,1,1,0,0,0)
x = (datetime.datetime.utcnow()- ep).total_seconds() |
这应该与int(time.time())有所不同,但使用类似x % (60*60*24)的东西是安全的。
日期时间-基本日期和时间类型:
Unlike the time module, the datetime module does not support leap seconds.
1
| 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
根据原始时间戳,有两种方法:
mktime()和timegm()。
http://docs.python.org/library/time.html网站