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

清理当前使用底层OS适配库代码,代码中涉及到了utc时间和本地时间转换。

发现代码中时区设置有问题。

每次设置时区时都会调用tzset函数,然后直接使用被初始化后的全局变量timezone去和utc时间相加减得到本地时间。

但是问题来了,这样做真的ok吗?

tzset的函数,反复看了关于该函数初始化tzname和timezone的使用说明。

在启动时第一次调用tzset,

---首先是以TZ环境变量为依据来获取时区信息timezone的,

-------若TZ环境变量为错的,无效的(但是存在!!!)则使用UTC时间,认为时区为0

------------然后TZ环境变量没有,则使用默认的locatime的时区文件来进行初始化时区,timezone=0。

上述流程已经通过程序验证过了。

但是问题来了,在运行过程中如果TZ环境变量变化了,此时如果调用tzset会刷新吗?因为这里涉及到时区被其他人更改后,能否同步的问题?

根据实际的程序验证,很不幸,如果是

TZ在运行过程中变化了

------直接在运行过程中tzset的调用不会起作用,timezone不会刷新。

---------关闭进程后,重新调用tzset后,发现TZ生效了。所以TZ对tzset的影响,看来只能是在第一次使用时才管用。

 

当然如果大家阅读过《Unix高级编程》,也知道其实localtime,mktime,等函数也是受时区影响了,可以看做使用的也是timezone这个全局变量,换句话说和上述的情况一样。使用tzset之后,如果改变TZ,其时区也不会变。

 

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