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中就没有这个文件。这个文件一般也仅仅是一个简单的表示。
最后我们基本可以得到下面的结论:
- BIOS时间即硬件时间没有时区
- Linux在启动时会根据
/etc/adjtime
的设置和当前的硬件时间计算出当前的UTC时间,并将其和1970 年1月1日的秒差记录在内核中,由时钟中断继续维护。 date
等工具获得的时间是根据Linux内核中保存的时间和/etc/localtime
的配置计算得来的。
其他相关问题,比如设置时间以及和Windows时间同步等可以参考下面的ArchLinux Wiki链接
参考: