我遇到了一个奇怪的问题,我的系统时钟知道这是夏令时,但 glibc 似乎没有。这是一个最新的 Ubuntu 安装,我检查了 /etc/localtime 并且它具有正确的转换时间,用于上周切换到 DST。
对我来说,当前正确的时区是太平洋夏令时 (UTC-7)。当我问我的系统我在哪个时区时,它正确地告诉我:
$ date +%z
-0700
但是当我运行以下程序时:
#include <time.h>
#include <stdio.h>
int main() {
tzset();
printf("%lu\n", timezone);
return 0;
}
输出错误地是:
28800
对应于 UTC-8 或太平洋标准时间。(不,我的环境中没有设置 TZ)
我认为 glibc 和 date 程序会从同一来源获取他们的时区信息,但显然要么他们没有,要么我误解了 glibc 时区全局的工作原理。
那么基本问题是:
- 为什么这两个输出不同
- 如何可靠地检测 C 程序中的系统 UTC 偏移量?