c - 为什么 glibc "timezone"global 与夏令时的系统时间不一致?

标签 c timezone glibc

我遇到了一个奇怪的问题,我的系统时钟知道现在是夏令时,但 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 和日期程序会从同一来源获取它们的时区信息,但显然它们要么没有,要么我误解了 glibc 时区全局的工作方式。

那么基本的问题是:

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

最佳答案

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

      The external variable timezone contains the difference, in seconds,
      between UTC and local standard time (for example, in the U.S. Eastern
      time zone (EST), timezone is 5*60*60).  The external variable daylight
      is non-zero only if a summer time zone adjustment is specified in the
      TZ environment variable.

关于c - 为什么 glibc "timezone"global 与夏令时的系统时间不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/635780/

相关文章:

无法按字母顺序(排序)字符串吗?

c - 对同一文件描述符的顺序写入调用,但只有第二个崩溃?

c - C char* 数组在内存中是什么样的?

datetime - ColdFusion 时区支持?

c# - Web 应用程序时区问题

c - -pthread、-lpthread 和最小的动态链接时间依赖性

c - Q线程 : how to stop an infinite loop

php - 为 MySQL 设置时区

linux-kernel - 更改linux内核系统调用号

c - MAP_ANONYMOUS 符合 C99 标准