Python的time.time()时区是否具体?

时间:2012-08-07 12:18:41

标签: python datetime time timezone

对于提出过于基本问题的道歉,但在阅读文档后我无法清除它。我似乎错过了或者误解了一些过于基本的东西。

从不同的时区调用time.time(),同时会产生不同的结果吗?这可能归结为epoch的定义,在文档上(以及我在互联网上不那么深入的搜索)中没有提及时区。

另外,假设time.time()已从具有不同时区的地方调用,并在其计算机上转换为UTC datetime,它们是否都会给出相同的UTC时间?

6 个答案:

答案 0 :(得分:19)

是的,time.time()返回自未指定的纪元以来的秒数。请注意,在大多数系统上,包含闰秒,尽管它是possible to configure your system clock to include them。在cpython上,time.time被实现为对C函数time的调用,C standard的每个§27.23.2.4.2不必使用指定的纪元:

  

time函数确定当前日历时间。值的编码是   未指定的。

几乎在所有操作系统(包括Linux,Mac OSX,Windows和所有其他Unix)上,时期为1970-1-1, 00:00 UTC,并且在这些系统上time.time 与时区无关

答案 1 :(得分:3)

返回值应该相同,因为它是UNIX Epoch的秒数偏移量。

话虽如此,如果您使用不同的时区将其转换为日期,那么这些值当然会有所不同。

如果从这些日期中将每个日期转换为UTC,则结果必须相同。

答案 2 :(得分:3)

根据documentation

  

将时间秒后的时间作为浮点数返回。   请注意,即使时间总是作为浮点返回   数字,并非所有系统都提供比1更精确的时间   第二。虽然此函数通常返回非递减值,但它   如果系统时钟,则可以返回低于上一次呼叫的值   在这两个电话之间被搁置了。

维基百科说“Unix epoch”:

  

Unix纪元是1970年1月1日00:00:00 UTC(或1970-01-01T00:00:00Z ISO 8601)的时间。

并继续

  

这个定义存在一个问题,因为UTC直到1972年才以现有形式存在;这个问题将在下面讨论。为简洁起见,本节的其余部分使用ISO 8601日期格式,其中Unix纪元是1970-01-01T00:00:00Z。

时间和日期很有趣。

鲜为人知的事实:瑞士在1894年之前的时区是34:08(34分8秒)。 1894年6月之后,它更新到29:44。 (link

答案 3 :(得分:2)

time.time()返回自1970年1月1日0:00 UTC开始的UNIX纪元以来的秒数。假设机器的时钟设置正确,它会在每台机器上返回相同的值。

答案 4 :(得分:1)

来自文档:

  

此模块中定义的大多数函数调用具有相同名称的平台C库函数。查阅平台文档有时可能会有所帮助,因为这些函数的语义因平台而异。

http://docs.python.org/library/time.html?highlight=time.time#module-time

所以答案是:它取决于。

答案 5 :(得分:0)

time.time()在任何同时运行time.time()的计算机上返回相同的值,即使这些计算机使用不同的时区。

我有两台机器,一台使用UTC,另一台使用UTC + 7。

我几乎同时在两台计算机上运行此脚本(UTC大约早三秒钟了):

import time
from datetime import datetime
import pytz

print("GENERATING TIMESTAMP:")
print("                                           time.time()", int(time.time()))
print("                            datetime.now().timestamp()", int(datetime.now().timestamp()))
print("datetime.utcnow().replace(tzinfo=pytz.UTC).timestamp()", int(datetime.utcnow().replace(tzinfo=pytz.UTC).timestamp()))
print("                         datetime.utcnow().timestamp()", int(datetime.utcnow().timestamp()))

ts = datetime.utcnow().replace(tzinfo=pytz.UTC).timestamp()

print("\nGENERATING DATETIME FROM TIMESTAMP ts =", ts)
print("                         datetime.fromtimestamp(ts)", datetime.fromtimestamp(ts))
print("            datetime.fromtimestamp(ts, tz=pytz.UTC)", datetime.fromtimestamp(ts, tz=pytz.UTC))
print("datetime.fromtimestamp(ts).replace(tzinfo=pytz.UTC)", datetime.fromtimestamp(ts).replace(tzinfo=pytz.UTC))

UTC机器打印以下内容:

GENERATING TIMESTAMP:
                                           time.time() 1601469475
                            datetime.now().timestamp() 1601469475
datetime.utcnow().replace(tzinfo=pytz.UTC).timestamp() 1601469475
                         datetime.utcnow().timestamp() 1601469475

GENERATING DATETIME FROM TIMESTAMP ts = 1601469475.713351
                         datetime.fromtimestamp(ts) 2020-09-30 12:37:55.713351
            datetime.fromtimestamp(ts, tz=pytz.UTC) 2020-09-30 12:37:55.713351+00:00
datetime.fromtimestamp(ts).replace(tzinfo=pytz.UTC) 2020-09-30 12:37:55.713351+00:00

UTC + 7机器打印此:

GENERATING TIMESTAMP:
                                           time.time() 1601469478
                            datetime.now().timestamp() 1601469478
datetime.utcnow().replace(tzinfo=pytz.UTC).timestamp() 1601469478
                         datetime.utcnow().timestamp() 1601444278

GENERATING DATETIME FROM TIMESTAMP ts = 1601469478.637603
                         datetime.fromtimestamp(ts) 2020-09-30 19:37:58.637603
            datetime.fromtimestamp(ts, tz=pytz.UTC) 2020-09-30 12:37:58.637603+00:00
datetime.fromtimestamp(ts).replace(tzinfo=pytz.UTC) 2020-09-30 19:37:58.637603+00:00

您会看到time.time()应该在任何计算机上返回相同的值,而不管该计算机使用的时区。

另外,假设从不同时区的地方调用了time.time(),并在其计算机上将其转换为UTC日期时间,那么它们都将提供相同的UTC时间吗?

是的,实验结果底部的第二行显示了这一点。