Python time
模块中的 time.time()
返回的是系统时间还是UTC时间?
Python time
模块中的 time.time()
返回的是系统时间还是UTC时间?
time.time()
函数返回自纪元以来的秒数,类型为浮点数。请注意,“纪元”是指在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
库将其转换为可读性更强的字符串。
import time
呢?只需移除毫秒部分即可得到时间戳:str(datetime.datetime.now()).split('.')[0]
。 - Hussaintime.time()
返回的时间戳并不处于任何时区,它不是"秒数(seconds)在UTC时区"。"自纪元以来的秒数(seconds since the epoch)" 是一个术语;它并不代表自某一时间点以来经过的已流逝秒数(elapsed seconds)。您可以使用时区数据库(tz database)将其转换为本地时间和/或UTC时区。另外,如果您省略 .strftime()
,结果几乎相同(+/- 微秒)。 - jfs这是用于文本文件中的时间戳文本格式。您可以使用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())
- Mr-IDEdatetime.datetime.utcnow()
是有害的。它创建了一个不是本地时间的无序日期时间。除非您的本地时间是UTC,否则它将是错误的。请改用datetime.datetime.now(datetime.timezone.utc)
。这会创建一个时区感知的日期时间,表示当前时间。 - Terrel Shumway根据#squiguy的回答,为了获得真正的时间戳,我会将其从浮点数类型转换。
>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
至少这就是概念。
type(time.time())
的输出结果为 <type 'float'>
,表示返回值的数据类型为浮点数。 - famousgarkinint()
是多态的。在旧版Python中,如果需要,它将返回long
-- 在新版Python中,所有整数都是长整型。 - jfs答案可能既不是也是。
不是: time.time()
返回自 Epoch 以来经过的秒数,结果不依赖于时区,因此既不是 UTC 也不是本地时间。这里是关于“自 Epoch 以来的秒数”的 POSIX 定义。
也是: time.time()
不需要您计算机的时钟同步,因此它反映了其值(尽管与本地时区无关)。在同一时间,不同的计算机可能会得到不同的结果。另一方面,如果您的计算机时间被同步,则可以从时间戳中轻松获取 UTC 时间(如果我们忽略闰秒):
from datetime import datetime
utc_dt = datetime.utcfromtimestamp(timestamp)
关于如何从各种Python版本的UTC时间中获取时间戳,请参见 如何将日期转换为根据UTC的时代秒数?
datetime.utcfromtimestamp
,并且是唯一正确的答案,而另一篇回答使用了datetime.fromtimestamp
,但是却获得了308个赞。-(表达失落或无奈) - user6996876time.time()
函数返回值的(非常简短)。你的评论回答了其他问题(自从我开始回答后,你已经更改了评论。而且变得更糟了)。另外一点,应该谨慎使用“正确”这个词(时区很复杂——没有银弹——只有特定用例的权衡)。 - jfsdatetime.datetime.utcfromtimestamp(ts)
。除非您的本地时间是UTC,否则它将是错误的,因为它创建了一个不是本地时间的naive datetime。相反,请使用datetime.datetime.fromtimestamp(ts, datetime.timezone.utc)
。这将创建一个时区感知的datetime,表示与时间戳相同的瞬间。 - Terrel Shumwaynaive_dt.astimezone()
不像 Python 3 中隐式的 bytes.encode()
那样存在。在许多情况下,内部使用 UTC 时间是有益的。关于 datetime 模块可以说很多话(我已经回答了足够多的问题以获得金徽章),但大多数都超出了“time.time()
返回什么”的范围。 - jfs#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
。 - MarkHu在特定时区中不存在“纪元”的概念。纪元被定义为特定的时间点,因此如果更改时区,则时间本身也会发生变化。具体来说,这个时间是1970年1月1日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'))
utc_time
字符串格式没问题,但作为datetime对象却存在风险。由于它是naive类型,如果在Python脚本中对其进行任何操作(如timedelta算术运算),它仍然会像本地时间一样行为。 - FObersteiner