Python 的 time.time() 是不是返回本地或 UTC 时间戳?

Posted

技术标签:

【中文标题】Python 的 time.time() 是不是返回本地或 UTC 时间戳?【英文标题】:Does Python's time.time() return the local or UTC timestamp?Python 的 time.time() 是否返回本地或 UTC 时间戳? 【发布时间】:2018-05-25 11:30:44 【问题描述】:

Python时间模块中的time.time()是返回系统时间还是UTC时间?

【问题讨论】:

时间戳没有时区。它们代表自纪元以来的秒数。纪元是不依赖于时区的特定时刻。 @jwg:常用的 POSIX 时间戳不计算闰秒,因此它们不是“自纪元以来的 [elapsed SI] 秒数”(它们很接近)。 我不认为这是一个准确的反对@J.F.Sebastian。闰秒不是“自纪元以来经过的秒数”。它们是时钟记录的时间表示的变化,与经过的秒数不对应。 @J.F.Sebastian 很抱歉造成混乱。闰秒不是“经过的秒数”。因此,作为“经过的秒数”的时间戳不也不应该包括闰秒。 @jwg 错误。你不能抹去物理时间。 POSIX 时间戳不是经过的 SI 秒数。这是一个示例:在纽约的“2016 年 12 月 31 日下午 6:59:59”和“2016 年 12 月 31 日晚上 7:00:01”之间经过了 3 秒,但相应的 POSIX 时间戳的差异仅为 2 秒(闰秒不计算在内)。 【参考方案1】:

time.time() 函数返回自纪元以来的秒数,以秒为单位。请注意,“纪元”定义为 UTC 时间 1970 年 1 月 1 日的开始。因此,时代是根据 UTC 定义的,并建立了一个全球时刻。无论你在“过去的秒数”(time.time())在同一时刻返回相同的值。

这是我在计算机上运行的一些示例输出,也将其转换为字符串。

Python 2.7.3 (default, Apr 24 2012, 00:00:54) 
[GCC 4.7.0 20120414 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> ts = time.time()
>>> print ts
1355563265.81
>>> import datetime
>>> st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
>>> print st
2012-12-15 01:21:05
>>>

ts 变量是以秒为单位返回的时间。然后我使用datetime 库将其转换为字符串,使其成为人类可读的字符串。

【讨论】:

为什么我们应该import time 当日期时间基本上给你时间戳。只需删除毫秒 - str(datetime.datetime.now()).split('.')[0] @Alexis Unix 纪元的定义非常明确 here。它甚至在页面下方指出了一个 Python 示例。我不明白你的评论。 @squiguy 老实说我不记得是什么让我这么说的。我一定是看错了一些东西,当我在法国和美国之间移动时,我一直在努力寻找为什么一些测试会失败,最终发现问题是因为 DST 使得一年中这个时期的一周变长了。对此感到抱歉,感谢您指出这一点。 它不是 "UTC 秒数。"。 The timestamp returned by time.time() is not in any timezone。 “自纪元以来的秒数”是一个术语;自某个时间点(纪元)以来,它不是 经过 秒。您可以轻松地将其转换为您的本地时间(使用 tz 数据库)和/或 UTC 时区。顺便说一句,如果你放弃.strftime(),结果(几乎)是相同的(+/- 微秒)。 datetime.utcfromtimestamp(ts) 在 UTC 时区创建一个 naive 日期时间。除非您的系统时间是 UTC,否则它将是错误的。 (datetime 模块中的大部分代码都将原始日期时间视为本地时间。)改为使用datetime.fromtimestamp(ts,datetime.timezone.utc),它在 UTC 时区中创建 时区感知 日期时间。【参考方案2】:

这适用于可在您的文本文件中使用的时间戳文本形式。 (问题的标题与过去不同,因此更改了此答案的介绍以阐明如何将其解释为时间。[2016-01-14更新])

您可以使用datetime.datetime.now().utcnow() 以字符串形式获取时间戳:

>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000

now 与预期的utcnow 不同——否则它们的工作方式相同:

>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000

您可以将时间戳显式呈现给字符串:

>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'

或者您可以更明确地以您喜欢的方式格式化时间戳:

>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'

如果你想要ISO格式,使用对象的.isoformat()方法:

>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'

您可以在变量中使用它们进行计算和打印而无需转换。

>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980

【讨论】:

我想要纪元时间......不是日期格式......从我提到的命令 time.time() 中可以明显看出 好的,没问题。其他人可能需要 timestamp 说放置在文本文件中。 我是另一个人,可能由于 不合理 的点赞数而被重定向到这里。该问题格式错误,并且接受的答案误导了典型需求:在最常用的服务器时区获取人类可读的后缀 - 例如文件名。 要将时间戳打印为字符串的一部分,请使用:Python2: import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow() Python3: import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow()) datetime.datetime.utcnow() 是邪恶的。它创建了一个非本地时间的天真日期时间。除非您的当地时间是 UTC,否则它将是错误的。请改用datetime.datetime.now(datetime.timezone.utc)。这将创建一个代表当前时间的时区感知日期时间。【参考方案3】:

根据#squiguy 的回答,为了得到一个真正的时间戳,我会从浮点数中输入它。

>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318

至少是这个概念。

【讨论】:

对时间戳进行类型转换的原因是什么?默认是什么类型? @Tizzee type(time.time())<type 'float'> 但是如果您需要比秒数更精确的时间,那么浮点数是有意义的。 @RudiSrydom:Python 是强类型的。不要将其与静态类型混淆。 @CheokYanCheng:int() 是多态的。如果有必要,它会在旧 Python 版本上返回 long——所有整数在新 Python 版本上都是长整数。【参考方案4】:

答案可能两者都不是,也可能两者兼而有之。

两者都不:time.time() 返回自 Epoch 以来经过的大约秒数。结果不依赖于时区,因此它既不是 UTC 也不是本地时间。这是POSIX defintion for "Seconds Since the Epoch"。

两者:time.time() 不需要同步系统时钟,因此它反映了它的值(尽管它与本地时区无关)。不同的计算机可能同时得到不同的结果。另一方面,如果您的计算机时间同步的,那么很容易从时间戳中获取 UTC 时间(如果我们忽略闰秒):

from datetime import datetime

utc_dt = datetime.utcfromtimestamp(timestamp)

关于如何在各种 Python 版本中从 UTC 时间获取时间戳,请参阅 How can I get a date converted to seconds since epoch according to UTC?

【讨论】:

这是唯一正确提及datetime.utcfromtimestamp 的答案,而datetime.fromtimestamp 的答案有308 人赞成:-( @TerrelShumway 问题是关于 time.time() 函数返回的内容(很短)。您的评论解决了其他一些问题(自从我开始回答以来,您已经更改了评论。更糟糕的是)。旁注;应谨慎使用“正确”一词(时区很复杂——没有灵丹妙药——只能针对特定用例进行权衡)。 不要使用datetime.datetime.utcfromtimestamp(ts)。除非您的本地时间是 UTC,否则它将是错误的,因为它会创建一个非本地时间的天真日期时间。请改用datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)。这将创建一个时区感知日期时间,表示与时间戳相同的时刻。 是的。我之前的评论大错特错。 datetime 模块中的大多数代码将原始日期时间视为本地时间。使用朴素的日期时间就像在不知道编码的情况下打开一个文本文件。 @TerrelShumway 认为 UTC 时间只能用于本地时间的系统是错误的。确实,stdlib 的某些部分将天真的日期时间对象视为具有本地时区(很遗憾)。我希望 naive_dt.astimezone() 不会像 Python 3 中不再存在的隐式 bytes.encode() 那样存在。确实,在许多情况下,在内部使用 UTC 时间是有益的。关于 datetime 模块可以说很多事情(我已经回答了足够多的问题以获得金牌)大多数都超出了这个问题的范围:time.time() 返回什么。【参考方案5】:

使用日期时间库获取本地时间戳,Python 3.x

#wanted format: year-month-day hour:minute:seconds

from datetime import datetime

# get time now
dt = datetime.now()
# format it to a string
timeStamp = dt.strftime('%Y-%m-%d %H:%M:%S')

# print it to screen
print(timeStamp)

【讨论】:

我使用这个时间戳,因为它很清楚它是什么日期和时间【参考方案6】:

我最终选择了:

>>> import time
>>> time.mktime(time.gmtime())
1509467455.0

【讨论】:

这可能会满足您的本地需求,但它可能会误导人们期望该范围内的数字是自 [GMT] 纪元以来的秒数。 time.time()1574115250.818733 一样返回十进制/浮点数,毫秒-since-epoch 很容易 int(time.time() * 1000) 例如1574115254915【参考方案7】:

在特定时区没有“纪元”之类的东西。纪元被明确定义为特定的时间点,因此如果您更改时区,时间本身也会发生变化。具体来说,这次是Jan 1 1970 00:00:00 UTC。所以time.time() 返回自纪元以来的秒数。

【讨论】:

虽然 UTC 确实是一个时间标准而不是时区,但标准是它与 GMT 共享相同的时间。所以....【参考方案8】:

timestamp 始终是 UTC 时间,但是当您调用 datetime.datetime.fromtimestamp 时,它会返回与此时间戳对应的本地时区的时间,因此结果取决于您的语言环境。

>>> import time, datetime

>>> time.time()
1564494136.0434234

>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)

存在具有不同行为的不错的库arrow。在同样的情况下,它会返回带有 UTC 时区的时间对象。

>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>

【讨论】:

【参考方案9】:

time.time() 返回 unix 时间戳。 您可以使用 datetime 库来获取本地时间或 UTC 时间。

import datetime

local_time = datetime.datetime.now()
print(local_time.strftime('%Y%m%d %H%M%S'))

utc_time = datetime.datetime.utcnow() 
print(utc_time.strftime('%Y%m%d %H%M%S'))

【讨论】:

以上是关于Python 的 time.time() 是不是返回本地或 UTC 时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 返回整数而不是字符串 [关闭]

使用 time.time() 更新 Python 全局时间变量不起作用

Python中的time模块与datetime模块用法总结

python 时钟嘀嗒数获取

python的基础语法介绍 1

python中time.time()和 time.strftime()