Python 时间模块中的 time.time()
是返回系统时间还是 UTC 时间?
time.time()
函数以浮点数形式返回纪元以来的秒数。请注意,“the epoch”定义为 UTC 时间 1970 年 1 月 1 日的开始。因此,时代是根据 UTC 定义的,并建立了一个全球时刻。无论您在地球上的哪个位置,“纪元后的秒数”(time.time()
) 在同一时刻返回相同的值。
这是我在计算机上运行的一些示例输出,也将其转换为字符串。
>>> import time
>>> ts = time.time()
>>> ts
1355563265.81
>>> import datetime
>>> datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
'2012-12-15 01:21:05'
>>>
ts
变量是以秒为单位返回的时间。然后我使用 datetime
库将其转换为人类可读的字符串。
这是可以在文本文件中使用的时间戳的文本形式。 (问题的标题与过去不同,因此更改了此答案的介绍以阐明如何将其解释为时间。[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
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)
。这将创建一个代表当前时间的时区感知日期时间。
根据#squiguy 的回答,为了得到一个真正的时间戳,我会从浮点数中输入它。
>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
至少是这个概念。
type(time.time())
提供 <type 'float'>
int()
是多态的。如果需要,它会在旧 Python 版本上返回 long
——所有整数在新 Python 版本上都是长整数。
答案可能两者都不是,也可能两者兼而有之。
两者都不是: time.time() 返回大约自 Epoch 以来经过的秒数。结果不依赖于时区,因此它既不是 UTC 也不是本地时间。这是“自纪元以来的秒数”的 POSIX 定义。
两者: 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 人赞成 :-(
time.time()
函数返回什么(它很短)。您的评论解决了其他一些问题(自从我开始回答以来,您已经更改了评论。更糟糕的是)。旁注;应该谨慎使用“正确”这个词(时区很复杂——没有灵丹妙药——只能针对特定用例进行权衡)。
datetime.datetime.utcfromtimestamp(ts)
。除非您的本地时间是 UTC,否则它将是错误的,因为它会创建一个非本地时间的天真日期时间。请改用 datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)
。这将创建一个时区感知日期时间,表示与时间戳相同的时刻。
naive_dt.astimezone()
不会像 Python 3 中不再存在的隐式 bytes.encode()
那样存在。确实,在许多情况下,在内部使用 UTC 时间是有益的。关于 datetime 模块可以说很多事情(我已经回答了足够多的问题以获得金牌)大多数都超出了这个问题的范围:什么 time.time()
返回。
要使用日期时间库获取本地时间戳,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)
我最终安顿下来:
>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
time.time()
像 1574115250.818733
一样返回十进制/浮点数,并且毫秒自纪元很容易 int(time.time() * 1000)
例如 1574115254915
在特定时区没有“纪元”之类的东西。纪元被明确定义为特定的时间点,因此如果您更改时区,时间本身也会发生变化。具体来说,这个时间是Jan 1 1970 00:00:00 UTC
。所以 time.time()
返回自纪元以来的秒数。
时间戳始终是 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]>
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'))
import time
。只需删除毫秒 -str(datetime.datetime.now()).split('.')[0]
time.time()
is not in any timezone。 “自纪元以来的秒数”是一个术语;自某个时间点(纪元)以来,它不是 经过 秒。您可以轻松地将其转换为您的本地时间(使用 tz 数据库)和/或 UTC 时区。顺便说一句,如果你放弃.strftime()
,结果(几乎)是相同的(+/- 微秒)。datetime.utcfromtimestamp(ts)
在 UTC 时区创建 naive 日期时间。除非您的系统时间是 UTC,否则它将是错误的。 (datetime 模块中的大部分代码都将原始日期时间视为本地时间。)请改用datetime.fromtimestamp(ts,datetime.timezone.utc)
,它会在 UTC 时区中创建 时区感知 日期时间。