下面看一下localtime, gmtime,mktime的实现:
如下图所示:localtime和gmtime共同使用全局内存_tmbuf存入计算的结果。所以多线程要避免使用这两个函数。__tz_convert依次调用tzset_internal(也是tzset的调用方法,用于从环境变量和文件中获取时区信息),__offtime计算时间。
(图中函数签名是一种老的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“的符号一致