Python 的 time.time() 时区是特定的吗?
Posted
技术标签:
【中文标题】Python 的 time.time() 时区是特定的吗?【英文标题】:Is Python's time.time() timezone specific? 【发布时间】:2012-08-04 11:00:03 【问题描述】:很抱歉提出了太基本的问题,但我在阅读文档后无法将其清除。似乎我在这里遗漏或误解了一些太基本的东西。
从不同的时区调用time.time()
会同时产生不同的结果吗?这可能归结为epoch
的定义,在文档中(以及我在互联网上不那么深入的搜索中)没有提及时区。
另外,假设 time.time() 已经从不同时区的地方调用,并在他们的机器上转换为 UTC datetime
s,他们都会给出相同的 UTC 时间吗?
【问题讨论】:
+1 考虑到错误答案的数量,这是一个很好的问题 :-) 因此考虑到闰秒和精度两者都是可配置/系统相关的,来自不同时区的机器的 time() 调用可能不一样。但是对于大多数系统来说,它是相同的。我的结论对吗? 而且几乎所有的答案(atm)都部分回答了我的问题,我会选择一个更完整的。 【参考方案1】:是的,time.time()
返回自未指定 epoch 以来的秒数。请注意,在大多数系统上,这不包括闰秒,尽管它是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
时区无关。 p>
【讨论】:
time() 返回“time() 将时间返回为自纪元 1970-01-01 00:00:00 +0000 (UTC) 以来的秒数。”根据 time(2) 手册页。 @AaronDigulla 哦,你完全正确。固定的。请注意,time(2)
理论上是特定于操作系统的。
所有基于 Unix 的系统都一样,因此只有 Windows 和 MacOS
@AaronDigulla 事实证明 time.time 在 Windows 上也使用相同的时代。只有一小部分系统实际上将时间作为自纪元以来的秒数返回 - 大多数系统都忽略了闰秒。来自time(2)
:This value is not the same as the actual number of seconds between the time and the Epoch (...)
。【参考方案2】:
返回值应该相同,因为它是以秒为单位的 UNIX Epoch 偏移量。
话虽如此,如果您将其转换为使用不同时区的日期,那么值当然会有所不同。
如果您从这些日期中将每个日期转换为 UTC,则结果必须相同。
【讨论】:
【参考方案3】:time.time()
返回自 UNIX 纪元于 1970 年 1 月 1 日 0:00 UTC 开始以来的秒数。假设机器的时钟设置正确,它在每台机器上返回相同的值。
【讨论】:
gmtime()
适用于 struct_time
而 time()
适用于秒。并且文档说gmtime()
与gmtime(time())
相同
是的,gmtime
将秒数转换为相应的 UTC struct_time。不确定这与问题有什么关系。
+1。 “假设机器的时钟设置正确……”【参考方案4】:
根据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)
【讨论】:
@AaronDigulla:您的编辑为这个答案增加了很多,它不再是 RobB 的。如果我是作者,我不会欣赏如此广泛的编辑。最好写一个长评论或单独的答案。【参考方案5】:来自文档:
该模块中定义的大部分函数都调用同名的平台 C 库函数。有时查阅平台文档可能会有所帮助,因为这些函数的语义因平台而异。
http://docs.python.org/library/time.html?highlight=time.time#module-time
所以答案是:视情况而定。
【讨论】:
这取决于 C 的time()
,它说:“time() 以自 Epoch 1970-01-01 00:00:00 +0000 ( UTC)。”【参考方案6】:
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 时间吗?
是的,实验结果倒数第二行显示。
【讨论】:
以上是关于Python 的 time.time() 时区是特定的吗?的主要内容,如果未能解决你的问题,请参考以下文章