strftime 和非标准化 dates/times

strftime and nonnormalized dates/times

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 你将看到的数字范围 printing 刚刚由 localtimegmtime.

创建

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

生成

但是如果strftime不限制各种struct tm的范围 字段到它们的 "normal" 值,这让我想知道有多少 一个突破界限的程序员在什么时候实际拥有的自由度 呼叫 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 question to the tz 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 的一致实现可能通过天真地读取和显示存储在结构中的值而不对它们执行任何分析来运行。