41

很抱歉提出了太基本的问题,但在阅读文档后我无法将其清除。似乎我在这里遗漏或误解了一些太基本的东西。

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

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

4

6 回答 6

22

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

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

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

于 2012-08-07T12:22:57.243 回答
4

返回值应该相同,因为它是以秒为单位的 UNIX 纪元偏移量。

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

如果从这些日期中将它们中的每一个都转换为 UTC,那么结果必须相同。

于 2012-08-07T12:23:33.070 回答
3

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

于 2012-08-07T12:22:16.640 回答
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。(链接

于 2012-08-07T12:23:54.657 回答
1

从文档中:

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

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

所以答案是:视情况而定。

于 2012-08-07T12:21:48.650 回答
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 时间吗?

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

于 2020-09-30T12:58:04.820 回答