Linux时间和timezone概念解释

在Docker环境中经常会遇到时区相关的问题,所以顺便也看了一下Linux系统下时间相关的一下配置和概念:

硬件时钟

硬件时钟也叫RTC(Real Time Clock)或者CMOS时钟,这个是保存在BIOS中的,仅能保存:年、月、日、时、分、秒这些时间数值,无法保存当前时区以及是否使用夏令时调节。

系统时钟

系统时钟也叫软件时钟,在系统时钟里是有时区等概念的,在Linux内核里,是保存为自 UTC 时间 1970 年1月1日经过的秒数。系统启动时会读取硬件时钟,并根据/etc/adjtime的设置计算当前的时钟。系统启动之后,系统时钟与硬件时钟独立运行,Linux 通过时钟中断计数维护系统时钟。

/etc/localtime

这个文件一般情况下是一个软链接,链接到/usr/share/zoneinfo/目录下的一个对应时区的二进制文件,比如设置Asia/Shanghai的时区,则/etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai,调用date等工具获取时间时会考虑这个配置。
建议并强烈建议将这个文件设置为软链接,很多人会直接拷贝文件,其实是不推荐的。所有的Linux系统都会依赖这个文件。

/etc/timezone

这个文件一般会记录时区的直接文字表示,或者是一个时间偏移(很少见),比如如果设置时区为Asia/Shanghai,则这个文件的内容就会是Asia/Shanghai。这个文件并不是在所有Linux中都存在,比如在我的ArchLinux中就没有这个文件。这个文件一般也仅仅是一个简单的表示。

最后我们基本可以得到下面的结论:

  1. BIOS时间即硬件时间没有时区
  2. Linux在启动时会根据/etc/adjtime的设置和当前的硬件时间计算出当前的UTC时间,并将其和1970 年1月1日的秒差记录在内核中,由时钟中断继续维护。
  3. date等工具获得的时间是根据Linux内核中保存的时间和/etc/localtime的配置计算得来的。

其他相关问题,比如设置时间以及和Windows时间同步等可以参考下面的ArchLinux Wiki链接

参考:

  1. https://wiki.archlinux.org/index.php/Time
  2. https://unix.stackexchange.com/questions/384971/whats-the-difference-between-localtime-and-timezone-files