如何获取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 个错误:
implicit declaration of function 'localtime_r' is invalid in C99
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 );
然后同时使用localtime
和gmtime
获取当前时区和UTC的分解时间:
struct tm *local = localtime( &t );
struct tm *zulu = gmtime( &t );
然后计算 local
和 zulu
的 tm_hour
成员之间的差异,这就是你的时区。
int tz = zulu->tm_hour - local->tm_hour;
您需要检查 local->tm_isdst
以说明夏令时,但这至少能让您入门。
我用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 个错误:
implicit declaration of function 'localtime_r' is invalid in C99
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 );
然后同时使用localtime
和gmtime
获取当前时区和UTC的分解时间:
struct tm *local = localtime( &t );
struct tm *zulu = gmtime( &t );
然后计算 local
和 zulu
的 tm_hour
成员之间的差异,这就是你的时区。
int tz = zulu->tm_hour - local->tm_hour;
您需要检查 local->tm_isdst
以说明夏令时,但这至少能让您入门。