libc中的时间函数

下面看一下localtime, gmtime,mktime的实现

如下图所示:localtime和gmtime共同使用全局内存_tmbuf存入计算的结果。所以多线程要避免使用这两个函数。__tz_convert依次调用tzset_internal(也是tzset的调用方法,用于从环境变量和文件中获取时区信息),__offtime计算时间。

 

image.pngimage.png(图中函数签名是一种老的c风格,先列出函数参数,然后再指定它们的类型)

tzset_internal函数:此函数首先获取tz = getenv ("TZ"),若TZ为NULL则将tz赋值为localtime;然后调用__tzfile_read (tz, 0, NULL);该函数将tz拼接到tzdir = getenv ("TZDIR")路径后面组成一个完整的文件名,接着读取此文件中的时区信息。若TZ不是一个有效的时区文件(如TZ='GMT-8'),则文件读取会失败。此时就会对TZ进行如下解析:1)跳过字符串到+-号的位置(左图);2)对后面数值处理。需要注意的是GMT-8的‘-’对offset的影响是+数。

最后这个函数修改全局变量timezone的值:__timezone = -tz_rules[0].offset;  timezone的符号与”GMT-8“的符号一致

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值