python time.time() 和“夏令时”

Posted

技术标签:

【中文标题】python time.time() 和“夏令时”【英文标题】:python time.time() and "Daylight Saving Time" 【发布时间】:2015-12-04 19:38:50 【问题描述】:

运行python(Windows或Linux)的计算机的时钟会发生什么 自动更改并调用time.time()?

我了解到,过去手动将时钟更改为某个值时,time.time() 的值会更小。

【问题讨论】:

试试看会发生什么。 在 Windows 下更改时钟是否会更改 UTC 值或我的语言环境时间值?编辑:Mhh 猜测更改时区会做到吗? 相关:How does python's time.time() method work? 更改时钟(通过控制面板、命令行或操作系统功能)通常将本地时间作为 输入,但最终必须在通过 Windows 设置之前将其转换为 UTC SetSystemTime 打电话。操作系统仅在内部跟踪 UTC。本地时间转换用于输入、显示和写入 Bios 等。请注意,更改时区不会更改跟踪的 UTC 值。它只会更改转换期间使用的区域。 【参考方案1】:

time.time()docs 状态:

以浮点数的形式返回自纪元以来的时间(以秒为单位)。

这里提到的特定时期是Unix epoch,即 1970 年 1 月 1 日午夜 UTC

由于始终基于UTC,因此不受更改计算机时区的影响,也不受计算机时区进入或退出夏令时的影响。

尽管该函数确实依赖底层实现来提供值,但这些实现始终以 UTC 形式返回值 - 无论操作系统如何。

特别是在 Windows 上,它最终会调用GetSystemTimeAsFileTime OS 函数,该函数以 UTC 形式返回其值。它不受时区选择或时区内 DST 变化的影响。

【讨论】:

没那么简单。 UTC 时间和操作系统认为的 UTC 时间可能不同。 当然,如果您说的是时钟同步,以及它的同步程度如何很好。但这不是我们在这里谈论的...... 我说的是出于任何原因的可能差异。假设在更改本地时区之前,时钟是精确的:您是否声称无论您如何更改本地时区设置,您都可以保留 UTC 和本地时间的先前值?例如,假设您在保持本地时间不变的情况下更改了 UTC 偏移量:您的主张是 UTC 时间也保持不变,这使得系统不一致,因为如果新旧 UTC 偏移量不同(本地 = utc + 偏移量:如果 offset 已更改,则不能同时保留 localutc)。 不,我没有声称你描述的内容。我只是说如果时钟相对于 UTC 是精确的,那么在更改时区之后,时钟相对于 UTC仍然是精确的。本地时间现在在 Windows 任务栏上的显示可能与以前不同,但基础 UTC 值不会被修改。 除非您声称在更改本地时区时无法保留本地时间(我不在乎只要可能);我的观点是——time.time() 值可能会改变,即使 all 您需要更改本地时区同时保留本地时间。【参考方案2】:

引用docs for time.time

虽然此函数通常返回非递减值,但它可以 如果系统时钟已经完成,则返回比先前调用更低的值 在两次通话之间回退。

调整系统时钟的值取决于平台。但是,根据 cmets,不应该包含基于 DST 的更改,因为 Python 支持的所有操作系统都提供系统调用以检索 UTC 中的当前时间(并且 DST 仅影响本地时间与 UTC 的关系)。

如果这不是一个足够好的保证,您可能更喜欢time.montonic,它保证永远不会倒退 - 但是,请注意它带有这个警告(并决定这对您的用例是否重要):

返回值的参考点是未定义的,所以只有 连续调用的结果之间的差异是有效的。

【讨论】:

Clock time is off on dual boot 表示 Linux 和 Windows 都可以使用 UTC 和本地时间选项。 Windows 更有可能将硬件时钟设置为本地时间。目前尚不清楚GetSystemTimeAsFileTime()(由time.time() 使用)在仅更改 DST 设置时返回什么(如果可能:相同的本地时间,不同的 DST 设置意味着不同的 utc 偏移量,因此可能不同的 utc 时间 - 否则系统将不一致)。 Windows 系统时间也以 UTC 表示。只有 BIOS 被写入本地时间。转换在启动时自动发生,并且只要本地时间发生变化(对于 DST、NTP 或用户修改),但 UTC 是由操作系统跟踪的,它不会因 DST 或其他时区变化而改变。请注意,GetSystemTimeAsFileTime 的文档明确指出返回值采用 UTC。 @MattJohnson:(1)我被msdn中的谎言咬了很多次,直到在相关系统上测试了相应的声明,我才相信它(2)价值(类似到 POSIX 时间戳)不在任何时区,尽管 GetSystemTimeAsFileTime() (100s of nanoseconds since 1600) can be converted to UTC easily。我不会猜测如果 DST 设置更改会发生什么(不是 transition 而是 setting 例如,在保持相同本地时间的同时设置不同的本地时区) 更改时区与更改时间无关。当您更改时区时,通过将系统时间转换为新时区来自动更新本地时间。因此,仅更改时区时不能保持相同的本地时间(除非这两个时区恰好与当前时间对齐)。换句话说,如果我的时钟是当地时间 7:00,并且我将时区从太平洋更改为东部(夏令时生效),我的本地时钟现在将显示为 10:00,因为基础 UTC 时间为 14: 00 没有变化(除了正常的向前滴答)。 @MattJohnson:我已经明确表示会保留当地时间。【参考方案3】:

time.time() 返回底层库返回的值。 Python 使用time(..)gettimeofday(.., nullptr)(取决于系统上可用的内容)。

https://github.com/python-git/python/blob/master/Modules/timemodule.c#L874

在这两种情况下都返回 UTC。例如:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/time.html

time() 函数应返回自 Epoch 以来的时间值(以秒为单位)

在对 Matt 进行有效评论后,我必须添加 epoch 的定义,其中明确指出 time 返回 UTC 时间。

纪元: 历史上,UNIX 系统时间的起源被称为 “格林威治标准时间 00:00:00,1970 年 1 月 1 日”。格林威治标准时间实际上不是 国际标准界认可的术语;所以, 这个术语,“时代”,用于缩写对实际的参考 标准,协调世界时。

要证明时代是一样的,请检查:

import time
a = time.gmtime(secs=0)
# time.struct_time(tm_year=2015, tm_mon=9, tm_mday=9, tm_hour=1, tm_min=3, tm_sec=28, tm_wday=2, tm_yday=252, tm_isdst=0)
b = time.localtime(secs=0)
# time.struct_time(tm_year=2015, tm_mon=9, tm_mday=9, tm_hour=3, tm_min=1, tm_sec=28, tm_wday=2, tm_yday=252, tm_isdst=1)

如果参数secs 为0,则这两个函数都使用从time.time() 返回的值。在我的例子中,tm_isdst 设置为本地时间为 true,gmtime 设置为 false(表示自纪元以来的时间) .

编辑:你在哪里读到这个值会变小?

【讨论】:

在同样的参考文献中,here 术语“纪元”是针对 UTC 定义的。所以它依赖于平台。 GMT 在所有现代用法中与 UTC 值相等。它们只是语义上的不同,而不是价值上的不同。 确实如此,我完成了我的回答。

以上是关于python time.time() 和“夏令时”的主要内容,如果未能解决你的问题,请参考以下文章

Python 常用函数Time

python-时间模块,randomossysshutiljson和pickle模块

python time模块常用方法小结

time和datetime模块

python中的常用内置模块

常用的python模块