6

我遇到了一个奇怪的问题,我的系统时钟知道这是夏令时,但 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 时区全局的工作原理。

那么基本问题是:

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

4 回答 4

3

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

      外部变量 timezone 包含差异,以秒为单位,
      在 UTC 和当地标准时间之间(例如,在美国东部
      时区(EST),时区为 5*60*60)。外部变量日光
      仅当在
      TZ 环境变量。
于 2009-03-11T18:47:13.277 回答
1

执行此操作后查看 tm.tm_isdst 字段:

  time_t current_time;
  struct tm tm;

  current_time = time(NULL);
  localtime_r(&current_time, &tm);

根据 localtime_r(3) 联机帮助页,这确实表明 DST 在指定时间是否有效。我认为您需要假设 DST 为您已经使用的 timezone(3) 变量增加了一小时,或者对 GMT 执行差异技巧。

在澳大利亚 AEST 为我工作,希望它对你有用。

于 2011-01-07T23:52:30.203 回答
0

这是我的代码,如果定义了linux,则使用 tm_gmtoff,否则使用 gettimofday 中的 timezone.tz_minuteswest(这里的 'ltm' 是本地时间的输出):

{
    int tz_offset;

#if defined(__linux__)
    tz_offset= ltm.tm_gmtoff;
#else
    tz_offset= -tz.tz_minuteswest*60 + ltm.tm_isdst*3600;
#endif

     printf ("LT = UTC +d sec\n", tz_offset);
}
于 2015-04-29T05:44:56.633 回答
0

您可以使用tm_gmtoff与 ::timezone 相同的 struct tm 成员,但它考虑 DST 并且符号相反。

http://www.gnu.org/s/libc/manual/html_node/Time-Zone-Functions.html#Time-Zone-Functions

于 2011-03-18T06:09:49.510 回答