开发者社区> 李名赫> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

解决嵌入式Linux中的时区问题

简介:
+关注继续查看

如果说让我做上层软件的工作,我做起来可以得心应手,但是让我做平台方面的工作(系统问题解决、驱动编写、软件移植等工作),确实不熟悉。所以很多问题都是摸着石头过河,没有经验。许多问题在有经验的朋友那里是小菜一碟,而放在我面前总是如遇大山。不免被嘲笑为“弱鸡”~

最近我在做基于 Realtek 芯片RTL8196E的家庭网关的研发工作。Realtek提供了一个Linux的SDK开发环境。由于硬件上没有RTC,所以其中Linux的系统(下面简称为RTLinux)时钟是不正确的。需要时间同步。这个我从busybox中集成了ntpd便可。但是,我发现就算是同步好了时间,在执行 date 命令输出的时间时区都不对。

我在网上找了许多Linux系统设置时区的办法。从部分是:将 /usr/share/zoneinfo/Asia/Shanghai 符号链接为 /etc/localtime 便可。我在自己的PC机Linux(下面简称为PCLinux)上尝试,果然奏效。而同样的方法运用到 RTLinux 却没有一点效果。

这是博主想抱怨两句:网上找到的资料大多是告诉你怎么怎么去做就能达到什么目标,而没有说明为什么要这么做,它内在的原理是什么。如果不知道为什么,那么一旦发生一点变化,就无法变通了。

经博主研究,解决上面问题的办法有两种:

  1. 设置 /etc/TZ 文件,在该文件中指明时区

  2. 设置 TZ 环境变量

若读者不想深究其原因,那后面的内容便不必再看了。


博主先是发现了 /etc/TZ 这个文件看似时区的意思,其内容为: PST8PDT7,不知道是什么意思。尝试改改它。

到busybox里去找找 "/etc/TZ",看是谁,是怎么实用这个文件的。没有找到相关的引用。

到Linux内核中去找。也没有~

到boards中去找。结果找到:

13002826_LoAQ.jpg

可以看出是在 romfs/lib/libc.so.0 库文件里的。

而这个库文件则是由toolchain的工具集中复制得来。

于是再到toolchain下去找,结果有很多:

003001_2Swn_243525.png

这时区的问题原来是由uclibc来决定的。

去看看uclibc/libc/misc/time/time.c中是怎么解决 /etc/TZ 文件的。

13002826_xdBX.jpg

read_TZ_file()函数从 __UCLIBC_TZ_FILE_PATH__宏所(值为"/etc/TZ")指文件中读取数据。

在 _time_tzset(int use_old_rules) 中设置时区。

大致过程:


e = getenv("TZ");
 
if ((!e && !(e = read_TZ_file(buf))) || !*e) {
    //!ERROR 
}

可见,e先是从环境变量中去读,如果没有再从 /etc/TZ 中去读这就是我们想要的原理。

接下来就是一大推解析相关的处理。这个我就不花时间去研究这个过程了,主要去看一下有没有相关的说明文档。

在uclibc的官网:http://www.uclibc.org/FAQ.html 中找"TZ",有:

13002827_LqIQ.jpg

在 http://lists.uclibc.org/pipermail/uclibc/2002-August/004010.html 找到解答:

13002827_2EBc.jpg

OK,我全明白了。 如果是在中国,那么就应该将变量设置成:"CST-8",试试看:

13002827_Zbme.jpg

成功!

现在有两种方案:

  • 直接到时区信息写到 /etc/TZ 文件

  • 在系统启动时,设置环境变量 TZ

这两者都可以做。我们先默认在 /etc/TZ 文件中写入 "CST-8"

问题解决!


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
宝塔linux面板时区不正确怎么修改
宝塔linux面板时区不正确怎么修改的方法。linux主机安装完宝塔面板后,默认都是中国时间东八区(北京时间是中国采用国际时区东八时区的区时作为标准时间。),但也有例外的时候。前几天刚安装宝塔面板的时候,就出现了默认时区为西五区的情况,面板的时间比本地时间整整差了11个小时,也导致了计划任务的混乱,那该怎么办?
0 0
Linux系统下的时区配置管理
Linux系统关于时区的配置有两种方式: 通过配置/etc/localtime和/etc/timezone文件。 通过配置TZ环境变量。
0 0
嵌入式Linux 硬件时间-系统时间-时区设置
Linux系统时间分为两种:系统时间和硬件时间。系统时间为Linux内核时间,硬件时间一般为BOIS中的RTC时间。Linux内核在启动时,会尝试读取BIOS中的RTC时间,并以此为基准设置系统时间。内核启动之后,系统时间和硬件即为两个独立的时间,各自运行。
0 0
Linux: 硬件时钟, 系统时钟, 网络时钟, 时区修改和同步
Linux: 硬件时钟, 系统时钟, 网络时钟, 时区修改和同步
0 0
Linux时区设置
Linux时区设置
0 0
Linux下设置时区方法,实现开机自动设置时区
Linux下设置时区方法,实现开机自动设置时区
0 0
嵌入式Linux修改时区
嵌入式Linux下修改系统的时区
0 0
Linux系统如何更改时间时区
Linux系统如何更改时间时区
0 0
jvm linux 时区设置
# 背景 在接入集团一个平台的时候,发现录制某个接口到测试环境回放,发现接口入参一致,一个start_day 一个end_day,但回放的时候会多调用一次数据库查询,很是奇怪; 查阅业务代码,发现确实有逻辑会导致多查询一次,于是重点观察数据变化,发现录制回放两个时间不一致,相差12个小时; 继...
1347 0
+关注
李名赫
博主从事的是物联网行业,目前在某知名智能家居科技公司担任家庭智能中心研发主管。欢迎交流!
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Decian GNU/Linux安全合规之路
立即下载
从 Linux 系统内核层面来解决实际问题的实战经验
立即下载
冬季实战营第二期:Linux操作系统实战入门
立即下载