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


558

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


87
时间戳没有时区。它们代表自纪元以来的秒数。纪元是不依赖时区的特定时间点。
jwg '16

2
@jwg:常用的POSIX时间戳记不算leap秒,因此它们不是“从纪元以来的[经过的SI]秒数”(它们接近)。
jfs

7
我认为这不是@JFSebastian的正确异议。ap秒不是“从纪元开始经过的秒数”。它们是时钟记录的时间表示形式的变化,与经过的秒数不对应。
jwg

4
@JFSebastian抱歉让您感到困惑。ap秒不是“经过的秒数”。因此,时间戳是“经过的秒数”,不应也不应包括leap秒。
jwg

2
@jwg错误。您无法删除物理时间。POSIX时间戳记不是经过的SI秒数。举个例子:在纽约的“ 2016年12月31日下午6:59:59 pm”和“ 2016年12月31日晚上7:00:01 pm”之间经过了3秒,但是相应的POSIX时间戳之间的差仅为2秒( second秒不算在内)。
jfs

Answers:


779

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库将其转换为字符串,从而使其成为人类可读的字符串。


72
为什么import time当datetime基本上给您时间戳时,我们为什么要这么做呢?只需删除毫秒-– str(datetime.datetime.now()).split('.')[0]
侯赛因

17
@Alexis Unix时代在这里非常清楚地定义。它甚至指出了一个Python示例,该示例沿页面向下移动。我不明白你的评论。
squiguy

9
@squiguy,老实说,我不记得是什么让我这么说。我一定误读了一些东西,我一直在努力寻找为什么为什么在我在法国和美国之间移动时某些测试被打破了,以便最终发现该问题是由于DST导致该年的这一周更长。对不起,谢谢您指出这一点。
亚历克西斯

5
不是“ UTC秒”。返回的时间戳time.time()不在任何时区。“自纪元以来的秒数”是一个术语;某个时间点(纪元)还不到秒。您可以轻松地转换为本地时间(使用tz数据库)和/或UTC时区。顺便说一句,如果删除.strftime(),结果(几乎)相同(+/-微秒)。
jfs 2014年

3
刚刚测试过,time.time()没有给出UTC时间,它给出了我的本地时区时间
slides_alpha

301

这是用于时间戳记文本形式可以在文本文件中使用。(问题的标题在过去是不同的,因此对该答案的介绍进行了更改,以阐明如何将其解释为时间。[2016年1月14日更新])

您可以使用.now().utcnow()来将时间戳记作为字符串获取datetime.datetime

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

1
我想要纪元时间....而不是日期格式...从我提到的命令time.time()中可以明显看出
Saransh Mohapatra

34
好,没问题 其他人可能需要时间戳记才能放置在文本文件中。
pepr

1
我是另一位,可能由于投票数量不合理而被重定向到这里。这个问题的格式不正确,被接受的答案对典型的需求有误导作用:在最常用的服务器时区中获得一个人类可读的后缀-例如文件名。

要将时间戳打印为字符串的一部分,请使用以下命令:Python2:import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
Mr-IDE

datetime.datetime.utcnow()是邪恶的。它创建一个非本地日期时间,而不是本地时间。除非您的本地时间是世界标准时间,否则将是错误的。使用datetime.datetime.now(datetime.timezone.utc)代替。这将创建一个表示当前时间的时区感知日期时间。
Terrel Shumway

139

根据#squiguy的答案,要获得真实的时间戳,我会键入从float转换的时间戳。

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

至少那是概念。


1
键入时间戳的原因是什么?默认情况下是什么类型?
Tizzee 2013年

3
@Tizzee type(time.time())<type 'float'>
famousgarkin

4
但是,如果您需要比几秒更精确的时间,则浮动是有意义的。
pepr 2014年

3
@RudiStrydom:Python是强类型的。不要将其与静态类型混淆。
jfs 2015年

1
@CheokYanCheng:int()是多态的。long如果有必要,它将在旧的Python版本上返回-在新的Python版本上,所有整数都长。
jfs 2015年

30

答案可能不是两者皆有。

  • 都不:time.time()返回距新纪元已过去的秒数。结果不取决于时区,因此它既不是UTC也不是本地时间。这是“自大纪元以来的第二个”POSIX定义

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

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

有关如何从各种Python版本的UTC时间获取时间戳的信息,请参见如何根据UTC将日期转换为自纪元以来的秒数?


4
这是唯一被正确提及的答案,datetime.utcfromtimestamp当答案为308时带有datetime.fromtimestamp:-(

@TerrelShumway的问题是关于time.time()函数返回的内容(这很短)。您的评论涉及其他问题(自从我开始回答以来,您已经更改了评论。更糟糕的是)。放在一边;应当谨慎使用“正确”一词(时区很复杂-没有灵丹妙药,只能权衡特定用例)。
jfs

不要使用datetime.datetime.utcfromtimestamp(ts)。除非您的本地时间是UTC,否则它将是WRONG,因为它会创建不是本地时间的天真的日期时间。使用datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)代替。这将创建一个时区感知日期时间,表示与时间戳相同的时刻。
Terrel Shumway

是。我以前的评论是完全错误的。datetime模块中的大多数代码将原始日期时间视为本地时间。使用朴素的日期时间就像在不知道编码的情况下打开文本文件一样。
Terrel Shumway

@TerrelShumway假定UTC时间只能在当地时间使用的系统上使用是错误的。的确,stdlib的某些部分将朴素的datetime对象视为具有本地时区(令人遗憾)。我希望它naive_dt.astimezone()不会像bytes.encode()Python 3中不再存在的隐式那样存在。确实,在许多情况下在内部使用UTC时间是有益的。关于日期时间模块,有很多事情可以说(我已经回答了足够多的问题以获得金牌),大多数问题超出了范围:time.time()返回什么。
jfs

4

我最终选择了:

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

1
这可能会满足您的本地需求,但可能会使人们误以为[GMT]时代以来的秒数。很容易time.time()返回十进制/浮点数1574115250.818733和毫秒数,因为- int(time.time() * 1000)例如1574115254915
MarkHu

3

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


虽然UTC确实是一个时间标准而不是时区,但标准是它与GMT共享同一时间。所以..
克雷格·希克斯

3

时间戳始终是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]>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.