strftime和非标准化日期/时间

时间:2018-07-03 02:06:05

标签: c language-lawyer strftime

strftime的{​​{1}},%H%M说明符的大多数定义(包括ANSI / ISO C标准中的定义符)都包含类似

的语言
  

%S被小时(24小时制)替换为十进制数字(00-23)。

现在,最后的小记号“(00-23)”告诉您 如果您使用%H,则会看到 打印只是由struct tmlocaltime 创建的。

我的问题涉及需求的存在与否 gmtime 必须引用的struct tm是 一个刚由strftimelocaltime生成的。我不认为有 这样的要求,但如果没有,则为“(00-23)” 和“((00-59))”对于 strftime-它们更多地是对值的错位要求 由gmtimelocaltime生成。

但是,如果gmtime不限制各种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); gmtime对我来说,将差异转换为HH:MM:SS格式。 但是,如果时间增量超过一天,我不会打印它 随着天;我只是把它与小时混为一谈(是的, 如果有几个月或几个月,最终可能会变成一个很大的数字 strftimet1之间的年份。

那么,语言律师的问题是:这合法且可移植吗? 呼叫t2时,strftimetm_hour和其余的 限制在正常范围内吗? (是的,我已经尝试过了, 非规范化的价值观行之有效-一点也不奇怪- 如流行的实现所预期的那样,但这不是 问题。)

[完全公开:我正在将same question发布到tz mailing list。]

1 个答案:

答案 0 :(得分:4)

C11标准7.27.3.5/3说:

  

如果任何指定值超出正常范围,则未指定存储的字符。

我的意思是输入必须被规范化才能使函数正常运行;并且strftime的一致实现可以通过天真地读取并显示存储在该结构中的值而无需对其进行任何分析来进行操作。