Python's time.time()是否返回本地时间戳或UTC时间戳?

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

1193190 次浏览

time.time()函数返回自epoch以来的秒数,作为浮点数。注意"的时代"定义为UTC时间1970年1月1日的开始。因此,epoch是根据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

nowutcnow不一样,否则它们的工作方式是一样的:

>>> 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

根据来自#squiguy的答案,为了获得一个真实的时间戳,我将从float类型转换它。

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

至少这是一个概念。

答案可能是两者都不是,也可能都是。

  • 都不是:time.time()返回从Epoch开始经过的大约秒数。结果不依赖于时区,所以它既不是UTC也不是本地时间。这里是POSIX定义为"Seconds Since the Epoch"

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

    from datetime import datetime
    
    
    utc_dt = datetime.utcfromtimestamp(timestamp)
    

On how to get timestamps from UTC time in various Python versions, see How can I get a date converted to seconds since epoch according to UTC?

在特定的时区里没有所谓的“epoch”。epoch被定义为一个特定的时间点,因此如果您改变了时区,时间本身也会改变。具体来说,这次是Jan 1 1970 00:00:00 UTC。因此,time.time()返回自epoch以来的秒数。

我最终决定:

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

时间戳总是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]>

要使用datetime库获取本地时间戳,请使用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)
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'))