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,其时区也不会变。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值