对于提出过于基本问题的道歉,但在阅读文档后我无法清除它。我似乎错过了或者误解了一些过于基本的东西。
从不同的时区调用time.time()
,同时会产生不同的结果吗?这可能归结为epoch
的定义,在文档上(以及我在互联网上不那么深入的搜索)中没有提及时区。
另外,假设time.time()已从具有不同时区的地方调用,并在其计算机上转换为UTC datetime
,它们是否都会给出相同的UTC时间?
答案 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)
将时间秒后的时间作为浮点数返回。 请注意,即使时间总是作为浮点返回 数字,并非所有系统都提供比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时间吗?
是的,实验结果底部的第二行显示了这一点。