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

python time.time() and “Daylight Saving Time”

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

我已经读过,当手动将时钟更改为某个值时,time.time()的值会更小。


time.time() docs说:

Return the time in seconds since the epoch as a floating point number.

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

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

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

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


引用time.time的文档,

While this function normally returns non-decreasing values, it can
return a lower value than a previous call if the system clock has been
set back between the two calls.

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

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

The reference point of the returned value is undefined, so that only
the difference between the results of consecutive calls is valid.


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

The time() function shall return the value of time in seconds since the Epoch

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

Epoch:
Historically, the origin of UNIX system time was referred to as
"00:00:00 GMT, January 1, 1970". Greenwich Mean Time is actually not a
term acknowledged by the international standards community; therefore,
this term,"Epoch", is used to abbreviate the reference to the actual
standard, Coordinated Universal Time.

为了证明这个时代是相同的检查:

1
2
3
4
5
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对于localtime设置为true,对于gmtime设置为false(表示自纪元以来的时间)。

编辑:你在哪里读到价值会更小?