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

前面一直在讲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字符串则表示需要加上(或者减去)多少
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值