Python的time.time()函数返回的是本地时间还是UTC时间戳?
Python的time.time()函数返回的是本地时间还是UTC时间戳?
在这段代码中,根据#squiguy的答案,为了获取真正的时间戳,需要将其从浮点数转换为整数。
>>> import time >>> ts = int(time.time()) >>> print(ts) 1389177318
至少这是概念上的理解。
为什么需要对时间戳进行类型转换?默认的类型是什么?
type(time.time())
的结果是<type 'float'>
。
但是,如果需要更精确的时间,浮点数是有意义的。
Python是强类型的。不要将其与静态类型混淆。
int()
是多态的。在旧版本的Python上,如果需要,它将返回long
- 在新版本的Python上,所有整数都是长整型。
问题的原因是在于获取时间戳时,time.time()
函数返回的是一个浮点数。为了获得整数类型的时间戳,需要将其进行类型转换。默认情况下,时间戳的类型是浮点数。如果需要更精确的时间,可以使用浮点数类型的时间戳。
解决方法是使用int()
函数对时间戳进行类型转换,将其转换为整数类型的时间戳。这样可以得到更精确的时间。在旧版本的Python中,int()
函数会返回长整型,而在新版本的Python中,所有整数都是长整型。
Python的time.time()返回的是本地时间还是UTC时间戳?
这个问题出现的原因是,有人想要获取时间戳而不是日期格式,所以提到了time.time()这个函数。然而,time.time()函数返回的是自1970年1月1日以来的秒数,而不是日期格式。
解决方法是使用datetime模块的datetime.datetime.utcnow()函数来获取UTC时间戳,或者使用datetime.datetime.now()函数来获取本地时间戳。另外,可以使用strftime()函数来将时间戳格式化成自定义的字符串格式。
以下是示例代码:
import datetime # 获取UTC时间戳 print(datetime.datetime.utcnow()) # 获取本地时间戳 print(datetime.datetime.now()) # 将时间戳转换为字符串 print(str(datetime.datetime.now())) # 将时间戳格式化为自定义字符串格式 print(datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")) # 获取ISO格式的时间戳 print(datetime.datetime.now().isoformat()) # 在变量中进行计算和打印 ts = datetime.datetime.now() tf = datetime.datetime.now() te = tf - ts print(ts) print(tf) print(te)
此外,如果要将时间戳作为字符串的一部分打印出来,可以使用以下代码:
Python 2:
import datetime print "%s: My timestamp message" % datetime.datetime.utcnow()
Python 3:
import datetime print ("%s: My timestamp message" % datetime.datetime.utcnow())
需要注意的是,datetime.datetime.utcnow()返回的是一个不带时区信息的时间戳,如果本地时间不是UTC时间,那么返回的时间戳是不准确的。可以使用datetime.datetime.now(datetime.timezone.utc)来获取一个带有时区信息的时间戳,以表示当前时间。
Python的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库将其转换为可读的字符串。
为什么我们在datetime中已经可以获得时间戳的情况下还要导入time呢?只需去除毫秒部分即可 - `str(datetime.datetime.now()).split('.')[0]`
Unix纪元在这里有明确的定义。该页面中还有一个Python示例。我不明白你的评论。
说实话,我不记得我为什么会这么说了。我一定是误读了某些内容,并且在我在法国和美国之间移动时,我一直在努力找到为什么某些测试会失败,最后发现问题是由于夏令时导致今年这个时期的一周变长。对此我感到抱歉,并感谢你指出这一点。
它不是"UTC时间的秒数"。time.time()返回的时间戳不属于任何时区。"距离纪元的秒数"是一个术语;它不是从某个时间点(纪元)开始经过的秒数。你可以很容易地将其转换为你的本地时间(使用时区数据库)和/或UTC时区。顺便说一句,如果去掉`.strftime()`,结果几乎是相同的(微秒级别的误差)。
刚刚测试了一下,time.time()并不返回UTC时间,而是返回我的本地时区时间。