我有这个代码
#include <stdio.h>
#include <time.h>
int main() {
char timestr[10];
struct timespec ts;
char tmz[6];
struct tm tm, *tmp = &tm;
clock_gettime(CLOCK_REALTIME, &ts);
gmtime_r(&ts.tv_sec, tmp);
strftime(tmz, 6, "%z", tmp);
snprintf(timestr, 7, "%s", tmz);
printf("Time: %s", timestr);
return 0;
}
这在 debian 上工作正常,但在 Mac 上给出无效时区。我在 Debian 和 Mac 上都有 IST 时区。
我的理解是,
gmtime_r
用时间值填充struct tm
,没有任何时区调整,基本上是UTC。那么 strftime
在 Debian 和 Mac 上都应该给出 +0000
但是这在 Debian 上给出了
+0000
,在 Mac 上给出了 +0530
。所以我有 UTC 的整个时间字符串,但时区信息在 Mac 上是 IST
我检查了
gmtime_r
指针中tmp
设置的时区偏移字段
long tm_gmtoff; /* offset from UTC in seconds */
它被正确设置为 0,但是
strftime
在进行计算时仍然考虑本地时区
有什么建议吗?
确实
gmtime_r
提供了非本地化的 UTC 时间结构,使用 strftime
读取它可以得到偏移量。 据苹果公司称:
strftime() 函数使用当前语言环境 参见https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/strftime.3.html