Windows、Mac 和 Ubuntu/Redhat 等主流操作系统如何处理 DST 和回溯 1 小时以上的时间?

Windows、Mac 和 Ubuntu/Redhat 等主流操作系统如何处理 DST 和回溯 1 小时以上的时间?

当时间不同步时,我知道大多数现代操作系统都有 NTP 软件,可以以智能增量进行操作,将其分散到一个较大的间隔内,这样就不会影响大多数软件。

但是,我无法理解对于将时间倒退 1 小时的地区如何做到这一点 - 这实际上是如何发生的内部细节。作为工程师,我们使用 UTC 来确保我们远离这些问题,程序只解释单向流的 UTC 时间,但程序在很多情况下处理本地时间并不罕见,例如,以本地时间登录等。

DST 调回 1 小时等在主要操作系统及其发行版中究竟是如何内部运作的?我正在寻找具体信息 - 例如,假设伦敦在 10 月 25 日将时钟从凌晨 2:00 调回至凌晨 1:00。一些时区还提供信息,以便确定这必须在何时进行。所有这些在幕后究竟意味着什么?

(背景:我来自一个全年都遵循固定偏移量的 tz,所以我对此的理解有点有限)

答案1

当我们回溯一个小时,即进入新的夏令时时,内部时钟如何知道这一点,并且不会一遍又一遍地重复呢?

当您在计算机上看到时间时,它是一系列计算的结果。实际上,时间是以秒为单位从过去的某个时间点开始计算的,每个设备的时间点有所不同,但当我们更改时区或夏令时时,这个时间不会改变。在 PC 上,它存储在 BIOS 或 UEFI 中。这实际上是我们在 2000 年遇到大问题的原因,但那是另一个故事。

因此,每个具有内部时钟的设备都知道当前时间,因为它知道从启动时间开始已经过了多少秒。

本质上,该设备有一个电池和一个正在运行的程序,该程序会不断将自起点以来经过的时间增加一秒。

当您谈论格式化时间时,您必须处理时区和夏令时。

时区会根据时区设置更改时钟(以小时为单位)。如果您位于 UTC+3,则时间计算如下:

start time -> elapsed time in seconds converted to years, months, days, hours, seconds. 
  \-> Add 3 hours
       \-> new time is correct time and date for UTC+3

当夏令时生效时,时间变为时间 + UTC+3 +DST+1

start time -> elapsed time in seconds converted to years, months, days, hours, seconds. 
  \-> Add 3 hours
       \-> Add 1 hour for Daylight saving
           \-> new time is correct time and date for UTC+3 +DST+1

这意味着,除了为时区增加 3 小时之外,还会为夏令时增加 1 小时。

当我们回到冬令时或 DST+0 时,下次计算日期和时间时,它会自动跳回一小时。

如您所见,计数的基本计时器永远不会改变。

如果您更改计算机上的日期/时间,它基本上会计算已经过去了多少秒,同时考虑时区和夏令时设置,然后将与起点的新差异更改为新的“从那时起已经过去了多少秒”计时器,这样,您的时间就会正确显示。

答案2

在 Linux 系统上,有关时区的信息由 提供tzdata

官方来源是: https://www.iana.org/time-zones

更多信息: https://en.wikipedia.org/wiki/Tz_database

相关内容