如何获取C99中的时区?

How to get the timezone in C99?

我用C99版本编译C,想尝试输出给定时间的时区

我使用的 IDE 将 GMT+0 作为时区,但我想以某种方式将其输出为 struct tm

所以我按照 this answer 的说明制作了这个程序:

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

int main()
{
    time_t present = time(NULL);
    struct tm now = *localtime(&present);
    now.tm_mon += 1;
    now.tm_year += 1900;
    struct tm t = {0};
    localtime_r(&present, &t);
    printf("%i/%i/%i %i:%i:%i from %s\n", now.tm_mon, now.tm_mday, now.tm_year, now.tm_hour, now.tm_min, now.tm_sec, t.tm_zone);
}

我这里好像有 2 个错误:

  1. implicit declaration of function 'localtime_r' is invalid in C99
  2. no member named 'tm_zone' in 'struct tm'

所以我检查了 IDE Manual,发现 localtime_r 确实存在,并且是 <time.h> 库的一部分。

所以现在我想知道 IDE 是否感到困惑或其他什么。我也不知道怎么解决。

This might get closed as it might "need debugging details", but read more.

由于这整个情况,我怎样才能在 C99 中获取时区(甚至可能是偏移量)并使其与 printf() 一起输出?

首先,localtime_r 不是标准库的一部分 - 它是某些实现提供的扩展,默认情况下它的声明不会在这些实现中公开。要使其可用,您必须在 包括 time.h 之前定义宏 _POSIX_SOURCE 以使其可用。一种简单的方法是在命令行上执行此操作,如下所示:

gcc -o tz -D_POSIX_SOURCE -std=c11 -pedantic -Wall -Werror tz.c

否则,只需在源代码中定义它,然后再包含 time.h:

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

其次,如果您只对本地时区感兴趣,那么还有一种更简单的方法 - 获取当前时间:

time_t t = time( NULL );

然后同时使用localtimegmtime获取当前时区和UTC的分解时间:

struct tm *local = localtime( &t );
struct tm *zulu  = gmtime( &t );

然后计算 localzulutm_hour 成员之间的差异,这就是你的时区。

int tz = zulu->tm_hour - local->tm_hour;

您需要检查 local->tm_isdst 以说明夏令时,但这至少能让您入门。