是否time.time()
Python的时间模块系统返回的时间或UTC时间?
是否time.time()
Python的时间模块系统返回的时间或UTC时间?
Answers:
该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
库将其转换为字符串,从而使其成为人类可读的字符串。
import time
当datetime基本上给您时间戳时,我们为什么要这么做呢?只需删除毫秒-– str(datetime.datetime.now()).split('.')[0]
time.time()
不在任何时区。“自纪元以来的秒数”是一个术语;距某个时间点(纪元)还不到秒。您可以轻松地将其转换为本地时间(使用tz数据库)和/或UTC时区。顺便说一句,如果删除.strftime()
,结果(几乎)相同(+/-微秒)。
这是用于时间戳记的文本形式可以在文本文件中使用。(问题的标题在过去是不同的,因此对该答案的介绍进行了更改,以阐明如何将其解释为时间。[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
import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow()
Python3:import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())
datetime.datetime.utcnow()
是邪恶的。它创建一个非本地日期时间,而不是本地时间。除非您的本地时间是世界标准时间,否则将是错误的。使用datetime.datetime.now(datetime.timezone.utc)
代替。这将创建一个表示当前时间的时区感知日期时间。
根据#squiguy的答案,要获得真实的时间戳,我会键入从float转换的时间戳。
>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
至少那是概念。
type(time.time())
给<type 'float'>
int()
是多态的。long
如果有必要,它将在旧的Python版本上返回-在新的Python版本上,所有整数都长。
答案可能不是两者皆有。
都不:time.time()
返回距新纪元已过去的秒数。结果不取决于时区,因此它既不是UTC也不是本地时间。这是“自大纪元以来的第二个”的POSIX定义。
两者:time.time()
不需要同步系统时钟,因此它可以反映其值(尽管它与本地时区无关)。不同的计算机可能同时获得不同的结果。另一方面,如果您的计算机时间是同步的,那么很容易从时间戳中获取UTC时间(如果我们忽略leap秒):
from datetime import datetime
utc_dt = datetime.utcfromtimestamp(timestamp)
有关如何从各种Python版本的UTC时间获取时间戳的信息,请参见如何根据UTC将日期转换为自纪元以来的秒数?
time.time()
函数返回的内容(这很短)。您的评论涉及其他问题(自从我开始回答以来,您已经更改了评论。更糟糕的是)。放在一边;应当谨慎使用“正确”一词(时区很复杂-没有灵丹妙药,只能权衡特定用例)。
datetime.datetime.utcfromtimestamp(ts)
。除非您的本地时间是UTC,否则它将是WRONG,因为它会创建不是本地时间的天真的日期时间。使用datetime.datetime.fromtimestamp(ts,datetime.timezone.utc)
代替。这将创建一个时区感知日期时间,表示与时间戳相同的时刻。
naive_dt.astimezone()
不会像bytes.encode()
Python 3中不再存在的隐式那样存在。确实,在许多情况下在内部使用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]>