c - strftime 和非标准化日期/时间

标签 c language-lawyer strftime

strftime%H%M%S 说明符(包括那些在 ANSI/ISO C 标准中)包含类似的语言

%H   is replaced by the hour (24-hour clock) as a decimal number (00-23).

现在,末尾的小符号“(00-23)”告诉您 如果 struct tm 您将看到的数字范围 打印是由 localtimegmtime 刚刚创建的。

我的问题涉及是否存在要求 strftime 引用的 struct tm 必须 一个刚刚由 localtimegmtime 生成的。我不认为有 这样的要求,但如果没有,那些符号“(00-23)” 和“(00-59)”对 strftime——它们更像是对值的错误要求 由 localtimegmtime 生成。

但是如果strftime不限制各种struct tm的范围 字段到他们的“正常”值,这让我想知道有多少 一个突破界限的程序员在什么时候实际拥有的自由度 调用 strftime。这些值是否像它们在 调用,比方说,mktime

为了使问题更具体,当我发现 我自己写这段代码:

time_t dt = t2 - t1;
struct tm *tmp = gmtime(&dt);
if(dt > 86400)
    tmp->tm_hour += dt / 86400 * 24;
strftime(etbuf, sizeof(etbuf), "elapsed: %H:%M:%S", tmp);

也就是说,我减去两次,让 gmtimestrftime 为我将差异转换为 HH:MM:SS 格式。 但如果时间增量超过一天,我就不会打印它 作为天数;我只是把它和时间混为一谈(这是真的, 如果有几个月或 t1t2 之间的年数)。

所以,语言律师问题:这合法且可移植吗? 调用strftime时,是tm_hourtm_min,其余 是否限制在他们的正常范围内? (是的,我试过了, 非标准化值起作用——一点也不奇怪—— 正如流行的实现所预期的那样,但事实并非如此 问题。)

[全面披露:我正在发布 same questiontz mailing list .]

最佳答案

C11 标准 7.27.3.5/3 说:

If any of the specified values is outside the normal range, the characters stored are unspecified.

我的意思是必须对输入进行规范化才能使函数正常运行; strftime 的一致实现可能会通过简单地读取和显示存储在结构中的值而不对它们执行任何分析来运行。

关于c - strftime 和非标准化日期/时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51145727/

相关文章:

python - 具有相同区域设置的不同 datetime.strftime 输出

c - 使用 linux framebuffer 进行适当的双缓冲

c - 当接收到 null-but-not-0 和 0-but-not-null 指针时,如何测试代码的行为?

c - PIC24H 中的高速 UART 中断导致 FreeRTOS 错误

c - 数字常量之前应为 ‘;’ 、 ‘,’ 或 ‘)’ 吗?这很奇怪

c++ - GCC不喜欢使用匿名命名空间转发声明来结交 friend ,但是MSVC愿意。什么?

c++ - 为什么函数范围内不允许类前向声明​​?

c++ - std::weak_ptr和对应的std::shared_ptr之间是否存在任何数据争用?

perl - 如何以 diff 命令返回的格式获取 perl 中文件的最后修改时间?

C - 如何将无符号整数秒转换为日期字符串