linux时区问题

时区问题

结束之前,我们探讨一个尚未展开的话题,即时区问题。这是非常容易让人迷惑的一个话题。因此放在文章的结尾处讨论会好些。

首先介绍两个缩写: UTC 和 LCT。

UTC 就是 Coordinated Universal Time,是全世界通用的时间标准。它是格林威治时间 (GMT)
的后继者,在计算机领域,GMT 术语不再广泛使用,因为它的精度不够高。UTC 是 1963
年标准化的,采用了高精度的原子钟。因此在科学领域,包括计算机科学,都采用 UTC 而不再使用 GMT 这个术语。我们可以认为 UTC
就是时区 0 的标准时间。LCT(Local Civil Time) 即当地时间,比如北京时间。

假如您耐心读到了这里,应该已经了解了系统时间 (system time) 和硬件时间 (RTC time) 的区别。硬件时间存放在
RTC(Real Time Clock) 硬件中。Linux 系统启动时,会读取 RTC
时间,并该时间来初始化系统时间;正常运行时,系统时间在每次 tick 中断中加以更新和维护;当系统关闭时,Linux
用系统时间来更新硬件时间。

Linux 系统时间总是 UTC 时间。那么硬件 RTC 中保存的是 UTC 还是 LCT 呢?

微软的 Windows 系统认定该时间为 LCT,即当地时间。我在上海的家里打开电脑,RTC 的时间是 2013-01-25
10:00:00,当系统启动后,会发现屏幕最右下角显示的当前时间就是 2013 年 1 月 25 日上午 10 点。

而在 Linux 系统中,RTC 的时间究竟是 LCT 还是 UTC 是由一个配置文件决定。RedHat
发行版中,该配置文件叫做/etc/sysconfig/clock。当该文件中有”UTC=true”这一行设定时,Linux 系统会将 RTC
时间解读为 UTC 时间,否则就解读为 LCT。(Debian 发行版依赖/etc/default/rcS 的设定来决定从 RTC 读入的是
UTC 还是 LCT)假设 RTC 中的时间还是 2013-01-25 10:00:00,并且/etc/sysconfig/clock
中有一行”UTC=true”,那么系统启动后就会将系统时间设置为 2013-01-25
10:00:00。如果/etc/sysconfig/clock 中没有这一行,系统 init 进程会将 RTC 中的时间解释为
LCT,并根据当前的时区配置计算出 UTC 时间,再用该时间设置系统时间 (hwclock 命令)。RTC 时间不变,现在的系统时间就变成了
2013-01-25 02:00:00,因为我的电脑在上海,系统计算出 UTC 为 8 小时之前。我们用
time()、gettimeofday() 等获得的时间值都是系统时间,即 UTC 时间。

可是桌面程序显示时间时,最好显示当地时间,您恐怕也不愿意每次看时间都需要在脑海中把格林威治时间转成当地时间吧。因此桌面应用通常会显示本地时间,我们常用的
date 命令也缺省显示 LCT。这是怎么做到的呢?

查看 date 的源代码,可以发现它用 localtime() 将调用 gettimeofday() 得到的 UTC 时间转换为 LCT
时间再进行输出。

那么 localtime() 是如何转换 LCT 的呢?感谢 POSIX 在这里有一个标准,Linux
系统将时区信息写入/etc/localtime 文件。该文件一般是/usr/share/zone 中某个文件的拷贝或者软链接。LibC 的
localtime 函数会读取/etc/localtime 获取本机的时区设置,然后进行复杂的时区转换,将给定 time_t 表示的 UTC
时间转换为 LCT。此外,在读取/etc/localtime 之前,localtime() 会先读取环境变量
TZ,因此用户也可以通过设置该环境变量来临时改变时区设置。/etc/localtime 文件中还包含了 Day Light
Saving,即夏令时的信息。在实行夏令时的地区,/etc/localtime 文件中包含了如何计算夏令时的必要信息,因此 LibC 函数
localtime 才能够正确地将 UTC 转换为 LCT。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值