Linux与Windows中的UTC时间
先介绍几个术语
UTC 协调世界时,又称世界标准时间或世界协调时间,简称UTC(从英文“Coordinated Universal Time”/法文“Temps Universel Cordonné”而来),是最主要的世界时间标准,其以原子时秒长为基础,在时刻上尽量接近于格林尼治平时。
GMT 格林威治标准时间(中国大陆翻译:格林尼治平均时间或格林尼治标准时间,台、港、澳翻译:格林威治标准时间;英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林威治天文台的标准时间,因为本初子午线被定义在通过那里的经线。
Localtime 本地时钟,即本地所在时区的当前时间。
简单意义上,UTC时间即等同于GMT时间。
操作系统使用两个时钟保存时间:硬件时钟和系统时钟。
- 硬件时钟(即实时时钟 RTC 或 CMOS 时钟)仅能保存:年、月、日、时、分、秒这些时间数值,无法保存时间标准(UTC 或 localtime)和是否使用夏令时调节。
- 系统时钟(即软件时间) 与硬件时间分别维护,保存了:时间、时区和夏令时设置。Linux 内核保存为自 UTC 时间 1970 年1月1日经过的秒数。初始系统时钟是从硬件时间计算得来,计算时会考虑/etc/adjtime的设置。系统启动之后,系统时钟与硬件时钟独立运行,Linux 通过时钟中断计数维护系统时钟。
硬件时钟是记录在BIOS中的时间。
对于Windows系统,默认会将BIOS中的硬件时钟当作Localtime,系统在关机时,Windows会将时间同步到硬件时间中去,因此BIOS时钟和系统时钟都成为Localtime.
对于Linux系统,如Red Hat系统,在安装时会有一个选项System clock uses UTC, 当勾选此选项时,表示系统将BIOS硬件时钟当作UTC时间,因此系统时钟会通过BIOS时间加减所在时区和夏令时计算出。如果不勾选此选项,系统将BIOS硬件时钟当作Localtime, 系统会直接同步硬件时钟到系统时钟而不经过时区的计算。Linux系统在关机时,这里还是举例Red Hat系统,在关机时会通过/etc/rc.d/init.d/halt这个脚本判断系统是否使用UTC硬件时间,如果使用UTC时间,这将系统时钟Localtime转换为UTC同步至硬件时钟,如果没有使用UTC时间,则直接同步系统时钟到硬件时钟,系统是否启用UTC硬件时钟在/etc/sysconfig/clock中设定。
Linux和Windows系统共存时
如果安装了Windows操作系统,那么最好将Windos设置为UTC硬件时钟,方法为修改注册表。这样Linux系统也可以使用UTC时钟,使用UTC时钟的好处是系统自动根据时区和夏令时来设置系统时钟。如果Windows要使用Localtime, 那么Linux最好也将UTC关闭使用Localtime. 如果Linux系统和Windows系统使用不一样的设置(即都使用默认设置),系统在关机时会同步硬件时钟,最后结果是硬件时钟被改来改去,不是Windows慢了8个小时,就是Linux快了8个小时。