分类: C/C++
2008-05-26 22:08:10
system-config-date的实现机制
转载时请注明出处:http://blog.csdn.net/absurd
前几天我们要开发一个时间(时区)设置的应用程序,所以花了一点时间去看config-date的实现,这里简单说一下config-date的工作机制和我们面临的一些问题。
1. 让时间生效分为两步,这是在dateBackend.py里实现的。首先调用date命令设置系统时间,然后调用hwclock命令把时间写到BIOS中。
2. 设置时区也分为两步,这是在timezoneBackend.py里实现的。首先把时区数据文件(/usr/share/zoneinfo/时区)拷贝到文件/etc/localtime,然后把时区信息写入到文件/etc/sysconfig/clock。中间还有一步是把时区数据文件拷贝到文件/var/spool/postfix/etc/localtime,这一步是可选的,取决于该文件是否存在,一般系统上/var/spool/postfix/etc/localtime都不存在,具体用途不清楚。
3. 时区列表数据是从文件/usr/share/zoneinfo/zone.tab中读取的。该文件记录了主要城市的时区信息,每一行描述一个城市:城市所在的国家、经/纬度和对应的时区数据文件等等。
4. 从glibc的代码来看,localtime和tzset两个函数只使用了/etc/localtime文件,该文件是一个二进制文件,结构有点复杂,没看得太明白。
我们遇到两个问题:
1. /usr/share/zoneinfo/zone.tab文件太大,有400多行,手机上屏幕比较小,用户很难找到想要的时区。解决办法:对它进行裁减,主要保留主要城市。
2. /usr/share/zoneinfo/zone.tab里记录的是城市精确的经/纬度,通过该经/纬度计算出来的偏移时间是小数,这倒不是大问题,取整就行了。问题是像上海和重庆这两个城市,我们希望得到同样8小时的时间偏移,这不可能根据经/纬度计算。时区数据文件中是有相关信息的,因为localtime这样的函数都可以正常工作。但是该文件的结构有点复杂,没搞明白。解决办法:自己定义了一张表记录这些信息,或者在选择时区时,时间不做同步更新。
不知大家遇到过同样的问题没有,是否有更好的办法呢?
~~end~~