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

本文探讨了Linux下C语言时区设置的详细过程,解释了tzset函数的内部实现,包括检查环境变量TZ,解析时区文件,处理夏冬令时等步骤。同时,文章指出通过export设置的环境变量与putenv设置的进程环境变量之间的差异,强调了正确设置和刷新时区的重要性,以及推荐使用时区文件来持久化时区设置。
摘要由CSDN通过智能技术生成
前面一直在讲tzset似乎只在初始化的时候才生效,当tzset调用多次时没用。
今天稍微深入的查找了glibc中的tzset的实现,发现其实不是这么回事,其真正的实现是每次都会去解析的。为什么之前会误认为tzset无效,是由于本地进程的环境变量和全局环境变量导致的。
具体的tzset的实现是tzset_internal,在这个函数中,其基本思路是:
1、首先检查环境变量中的TZ环境变量是否存在、有效
2、根据TZ环境变量获取指定的时区文件的路径和文件名
3、保存当前使用的这个环境变量TZ
4、尝试去读取数据文件,这里的数据文件即时区文件tzfile,注意其数据是按固定格式来的。
5、在上述的step4中,会根据tzfile文件,去刷新timezone和daylight的。确定解析tzfile文件成功之后,还会将一个名为__use_tzfile的变量置为1
6、根据上述解析的结果,根据 __use_tzfile是否为1来确定是否需要继续,若没有解析tzfile成功,则判断tz是否有效,无效则刷新tzname的值,认为默认使用UTC时间。
7、若上述操作过程中,发现tzfile解析失效,而tz是有效的,则需要最后去解析tz环境变量,这种情况下tz环境变量是是有时间的,其时间是用来设置夏冬令时的,即daylight saving time的。
上述解析的过程中,可以看到其实也是与man手册的说明是一致的。
手册中,已经明确说明了TZ环境变量的三种格式
(1)在本地时区中没有夏冬令时则可使用如下格式:std offset
      std表示的时区的名字,是三个字母 表示的。而offset字符串则表示需要加上(或者减去)多少
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值