Linux在C语言下的时区设置与修改(二)

前面说到是去同步时区的接口,

从同步的角度来讲,如何获取被设置后的时区,还有一个接口即gettimeofday,

这个接口不仅可以获取时区,posix标准似乎还很好心的在第二个参数中放置了可以用来获取时区和夏冬令时的tz参数,用于返回这两个值。

事情真的有这么简单吗?

墨菲定律又一次出现了,tz这个参数已经被废弃掉了,手册中已经明确说明了glibc不支持这个参数。那么实际使用这个接口,真的可以获取到吗?

写程序验证过后,发现这个接口虽然手册中已明确说不支持,但是实际上仍然是可以获取到得。

但是依赖于这个参数来获取时区,如果程序写完了到各个平台和版本上使用。

你确定晚上睡觉时想起来不会一身冷汗?所以时区的获取到这里已经没法继续了。


二、设置时区

那我们再来看看和这个函数对应的设置时区的接口,那就是settimeofday。

这个接口可以对时间进行设置,但是有一点需要注意,你必须是有root权限才行,否则调用失败那是必须的。

该接口中有tz的参数,可以对时区和夏冬令时进行设置,但是同理tz这个参数已经被废弃掉了,又是一个鸡肋。

之前尝试过准备用这个接口来进行时间,设置系统时间吧,时区就别想了。

查过settimeofday,这是系统调用,tzset则是gilibc提供的实现。


不讲同步了,那么单纯的讨论下时区怎么设置吧,

如果不是编程而是单纯在Linux下设置时区,可以用下面的前两种,后面第三种比较通用哈

1)可以使用tzselect命令,这是一个交互式命令,会要求你按提示选择时区,然后设置。

2)听说在redhat和CentOS上,可以使用timeconfig命令,这个是从网上的来的消息,还没有尝试,待会可以去试下

剩下的一种是大杀器

3)通过拷贝时区信息文件,从/usr/share/zoneinfo/$主时区/$次时区 拷贝成 /etc/localtime,注意这里的locattime是一个时区文件,当然也可以建立链接。

这个相信是通用性比较好的手段,因为现在linux系统中特别是比较完备的系统中都是使用时区信息文件来设置时区,保存时区。

但是这个也有缺陷:

1.据我所知,android的不是这样来设置时区

2.很多嵌入式的Linux设备,由于Flash的大小限制,把这些时区信息文件都裁掉了,而且文件系统中的这些目录都是不可写的,都没法操作。

你确定这样的系统你能用上第三种武器吗?


看来没有什么是完美的。后面可能会跟踪具体实现原理去看下,要找到实际的解决方法才行。



你可能感兴趣的:(Linux中C/C++编程)