当时间不同步时,我知道大多数现代操作系统都有 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
。