为什么glibc"timezone"全球不同意DST的系统时间?

Tyl*_*nry 6 c timezone glibc

我遇到了一个奇怪的问题,我的系统时钟知道它是夏令时,但glibc似乎没有.这是一个最新的Ubuntu安装,我检查了/ etc/localtime,它有正确的转换时间,用于上周切换到夏令时.

对我来说,目前正确的时区是太平洋夏令时(UTC-7).当我问我的系统我在哪个时区时,它正确告诉我:

$ date +%z
-0700
Run Code Online (Sandbox Code Playgroud)

但是当我运行以下程序时:

#include <time.h>
#include <stdio.h>

int main() {
  tzset();
  printf("%lu\n", timezone);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是错误的:

28800
Run Code Online (Sandbox Code Playgroud)

对应于UTC-8或太平洋标准时间.(不,TZ未在我的环境中设置)

我认为glibc和日期程序会从同一来源获得他们的时区信息,但显然要么他们没有,要么我误解了glibc时区全球的运作方式.

那么基本问题是:

  1. 为什么这两个输出不同
  2. 如何可靠地检测C程序的系统UTC偏移?

Ran*_*tor 3

我不认为“时区”会随着夏令时而改变。尝试“日光”变量。在我的系统上:

      外部变量 timezone 包含差异(以秒为单位),
      UTC 和当地标准时间之间(例如,在美国东部时间)
      时区(EST),时区为5*60*60)。外部变量日光
      仅当在 中指定了夏季时区调整时才为非零
      TZ 环境变量。