You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C23标准中.tm_isdst与timegm()的交互机制探究

C23标准中timegm()函数的行为分析

C23标准新增了timegm()函数,其定义为:将timeptr指向的结构体中以UTC表示的分解时间,转换为与time()函数返回值编码一致的日历时间值。以下围绕三个核心问题展开分析:

问题1:struct tm的.tm_isdst > 0是否会影响timegm()的返回值?

C23标准并未直接说明timegm()对.tm_isdst成员的处理规则。类比UTC时区下mktime()的行为,理论上timegm()应当忽略该成员,但不同实现之间存在差异。

问题2:当.tm_isdst为正值时,是否会被调整?

由于UTC不存在夏令时,预期该成员会被置零,但C23标准仅提及函数成功时会调整struct tm的其他成员,未明确针对.tm_isdst作出规定。

问题3:忽略.tm_isdst并将其置零是否为唯一合规结果?

GCC库的测试案例显示,其在计算返回的time_t值时会忽略.tm_isdst成员,同时会将该成员置零。

演示代码与验证输出

通过两段测试代码可验证上述行为:

代码示例1

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

int main() {
    struct tm tm = {0};
    tm.tm_year = 123; // 对应2023年(1900 + 123)
    tm.tm_mon = 0;    // 对应1月(0起始)
    tm.tm_mday = 1;   // 对应1日
    tm.tm_isdst = 1;  // 夏令时标志设为正值

    time_t t = timegm(&tm);
    printf("timegm返回值: %lld\n", (long long)t);
    printf("处理后tm_isdst值: %d\n", tm.tm_isdst);
    return 0;
}
输出1
timegm返回值: 1672531200
处理后tm_isdst值: 0

代码示例2

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

int main() {
    struct tm tm = {0};
    tm.tm_year = 120; // 对应2020年
    tm.tm_mon = 6;    // 对应7月
    tm.tm_mday = 4;   // 对应4日
    tm.tm_hour = 12;  // 对应12时
    tm.tm_isdst = 2;  // 夏令时标志设为非标准正值

    time_t t = timegm(&tm);
    printf("timegm返回值: %lld\n", (long long)t);
    printf("处理后tm_isdst值: %d\n", tm.tm_isdst);
    return 0;
}
输出2
timegm返回值: 1593873600
处理后tm_isdst值: 0

需要说明的是,本文参考的ISO/IEC 9899:2024草案可能存在内容过时的情况。


内容的提问来源于stack exchange,提问作者chux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:37:04