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

Sar*_*tra 532 python time timezone

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

squ*_*guy 748

time.time()函数返回自纪元以来的秒数,以秒为单位.请注意,"epoch"定义为1970年1月1日UTC的开头.因此,时代是以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
>>>
Run Code Online (Sandbox Code Playgroud)

ts变量是在几秒钟内返回的时间.然后我使用datetime库将其转换为字符串,使其成为人类可读的字符串.

  • 当datetime基本上给你时间戳时,我们为什么要"导入时间".只需删除毫秒 - `str(datetime.datetime.now()).split('.')[0]` (71认同)
  • @Alexis Unix epoch的定义非常清楚[这里](http://www.epochconverter.com/).它甚至在页面上指出了一个Python示例.我不明白你的评论. (17认同)
  • @squiguy说实话我不记得是什么让我这么说.我一定是误读了一些东西,而且当我在法国和美国之间移动时,我一直在努力寻找为什么有些测试会破裂,最终发现这个问题是因为DST使得这一周的这一周更长.对此感到抱歉,谢谢你指出这一点. (8认同)
  • 它不是*"UTC的秒数."*.[`time.time()`返回的时间戳不在任何时区](http://stackoverflow.com/a/20035913/4279)."自纪元以来的秒数"是一个术语; 从某个时间点(纪元)开始,它不是*经过*秒.您可以*轻松地将*转换为您当地时间(使用tz数据库)和/或UTC时区.顺便说一句,如果你删除`.strftime()`,结果(几乎)相同(+/-微秒). (5认同)
  • `datetime.utcfromtimestamp(ts)` 在 UTC 时区创建一个“天真的”日期时间。除非您的系统时间是 UTC,否则它将是错误的。(datetime 模块中的大多数代码将原始日期时间视为本地时间。)而是使用“datetime.fromtimestamp(ts,datetime.timezone.utc)”,它在 UTC 时区创建*时区感知*日期时间。 (5认同)
  • `time.time()`[文档](http://docs.python.org/2/library/time.html) (3认同)
  • @Alexis 绝对正确:使用 `time.gmtime()` 获取 UTC,注释很容易理解:datetime.fromtimestamp 返回 **本地** 时间,而不是 UTC 时间 (2认同)
  • 刚刚测试过,time.time()没有给出UTC时间,它给出了我的本地时区 (2认同)

pep*_*epr 293

这是用于文本文件中可以使用的时间戳文本形式.(问题的标题在过去是不同的,所以对这个答案的介绍进行了修改,以澄清它如何被解释为时间.[更新2016-01-14])

您可以使用获得的时间戳作为字符串.now().utcnow()datetime.datetime:

>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000
Run Code Online (Sandbox Code Playgroud)

now不同于utcnow预期-否则他们的工作方式相同:

>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000
Run Code Online (Sandbox Code Playgroud)

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

>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'
Run Code Online (Sandbox Code Playgroud)

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

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

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

>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'
Run Code Online (Sandbox Code Playgroud)

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • 好的,没问题.其他人可能需要*时间戳*说放在文本文件中. (32认同)
  • 我想要纪元时间......不是日期格式......从我提到的命令 time.time() 可以明显看出 (2认同)
  • `datetime.datetime.utcnow()` 是邪恶的。它创建一个非本地时间的简单日期时间。除非您的当地时间是 UTC,否则它将是错误的。请改用“datetime.datetime.now(datetime.timezone.utc)”。这将创建一个表示当前时间的时区感知日期时间。 (2认同)

Rud*_*dom 132

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

>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
Run Code Online (Sandbox Code Playgroud)

至少这是概念.

  • 但是如果你需要更精确的时间而不是秒,漂浮是有道理的. (4认同)
  • @Tizzee`type(time.time())`给`<type'float'>` (3认同)
  • @RudiStrydom:Python是强类型的.不要将它与静态类型混淆. (3认同)

jfs*_*jfs 29

答案可能不是或两者兼而有之.

  • both:time.time()返回大约自Epoch以来经过的秒数.结果不依赖于时区,因此既不是UTC也不是本地时间.这是POSIX对"大纪元以来的秒"定义.

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

    from datetime import datetime
    
    utc_dt = datetime.utcfromtimestamp(timestamp)
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 这是唯一正确提及`datetime.utcfromtimestamp`的答案,而对带有`datetime.fromtimestamp`的答案有308票支持:-( (4认同)

Har*_*rry 8

要使用日期时间库获取本地时间戳,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)
Run Code Online (Sandbox Code Playgroud)