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

本文探讨了在使用tzset函数进行时区设置时遇到的问题。当TZ环境变量在程序运行过程中发生变化时,tzset并不会更新时区设置。文章通过实验验证了只有在进程重启后,新的TZ设置才会生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

清理当前使用底层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,其时区也不会变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值