调用tzset依然无法刷新时区问题
本文最后更新于:2025年11月19日 下午
问题现象
一个程序运行时,时区信息是固定的。当外部修改时区信息后,程序并不能知道,还是用的缓存的时区。这时程序的时间就是错误的。
一般的解决办法是,进程内调用tzset函数,这可以刷新时区信息,使其得到正确的时间。
问题在于我在程序里面调用了tzset,时间还是没有刷新。
原因
结论:c库代码有点问题。
tzset的glibc实现里面,会先获取环境变量TZ,如果和缓存的没有区别,那么就直接返回了。关键代码(glibc2.3.3)如下
1 | |
因为我的进程没有这个TZ环境变量(应该大部分进程都没有,我看我的ubuntu下也没有),所以总是默认值,老的也是默认值。判断相等。直接返回了。
新一点的glibc库就没有这个问题了。根据看代码,glibc > 2.3.3就改了这里
如何解决
只能曲线救国。人为设置TZ环境变量。多调用两次tzset,如下:
1 | |
这样就可以通过tzset里面的TZ环境变量判断。
参考
Why does my timezone not update in embedded linux?
人生苦短,远离bug
Leon, 2025-01-09
调用tzset依然无法刷新时区问题
https://leon0625.github.io/2025/01/09/71895efc4d6d/