Python的time.time()时区是特定的吗?



很抱歉问了太基本的问题,但在阅读文档后我无法清除它。似乎我在这里错过或误解了一些太基本的东西。

同时

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

另外,假设 time.time() 是从具有不同时区的地方调用的,并在他们的机器上转换为 UTC datetime s,它们都会提供相同的 UTC 时间吗?

是的,time.time()返回自未指定纪元以来的秒数。请注意,在大多数系统上,这不包括闰秒,尽管可以将系统时钟配置为包含它们。在cpython上,time.time被实现为对C函数time的调用,根据C标准的§27.23.2.4.2,它不必使用指定的纪元:

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时代":

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 时间吗?

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

相关内容

  • 没有找到相关文章