很抱歉提出了太基本的问题,但在阅读文档后我无法将其清除。似乎我在这里遗漏或误解了一些太基本的东西。
从不同时区调用是否会time.time()
同时产生不同的结果?这可能归结为 的定义epoch
,在文档(以及我在 Internet 上不那么深入的搜索中)没有提及时区。
另外,假设 time.time() 已从具有不同时区的地方调用,并datetime
在他们的机器上转换为 UTC ,它们都会给出相同的 UTC 时间吗?
是的,返回自未指定epochtime.time()
以来的秒数。请注意,在大多数系统上,这不包括闰秒,尽管可以将系统时钟配置为包括闰秒。在 cpython 上,实现为对 C 函数的调用,根据C 标准的第 27.23.2.4.2 节,它不必使用指定的时期:time.time
time
该
time
函数确定当前日历时间。该值的编码未指定。
在几乎所有操作系统(包括 Linux、Mac OSX、Windows 和所有其他 Unix)上,纪元是1970-1-1, 00:00 UTC,并且在这些系统time.time
上与时区无关。
返回值应该相同,因为它是以秒为单位的 UNIX 纪元偏移量。
话虽如此,如果您将其转换为使用不同时区的日期,则值当然会有所不同。
如果从这些日期中将它们中的每一个都转换为 UTC,那么结果必须相同。
time.time()
返回自 UNIX 纪元开始于 1970 年 1 月 1 日 0:00 UTC 以来的秒数。假设机器的时钟设置正确,它在每台机器上返回相同的值。
根据文档:
以浮点数形式返回自纪元以来的时间(以秒为单位)。请注意,尽管时间始终以浮点数形式返回,但并非所有系统都提供比 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。(链接)
从文档中:
该模块中定义的大部分函数都调用同名的平台 C 库函数。有时查阅平台文档可能会有所帮助,因为这些函数的语义因平台而异。
http://docs.python.org/library/time.html?highlight=time.time#module-time
所以答案是:视情况而定。
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 时间吗?
是的,实验结果底部的第二行表明了这一点。