strftime() 返回 UTC 时间的本地时区

问题描述 投票:0回答:1

我有这个代码

#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
在进行计算时仍然考虑本地时区

有什么建议吗?

macos datetime debian
1个回答
0
投票

确实

gmtime_r
提供了非本地化的 UTC 时间结构,使用
strftime
读取它可以得到偏移量。 据苹果公司称:

strftime() 函数使用当前语言环境 参见https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/strftime.3.html

© www.soinside.com 2019 - 2024. All rights reserved.