strftime
的{{1}},%H
和%M
说明符的大多数定义(包括ANSI / ISO C标准中的定义符)都包含类似
%S
被小时(24小时制)替换为十进制数字(00-23)。
现在,最后的小记号“(00-23)”告诉您
如果您使用%H
,则会看到
打印只是由struct tm
或localtime
创建的。
我的问题涉及需求的存在与否
gmtime
必须引用的struct tm
是
一个刚由strftime
或localtime
生成的。我不认为有
这样的要求,但如果没有,则为“(00-23)”
和“((00-59))”对于
strftime-它们更多地是对值的错位要求
由gmtime
和localtime
生成。
但是,如果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格式。
但是,如果时间增量超过一天,我不会打印它
随着天;我只是把它与小时混为一谈(是的,
如果有几个月或几个月,最终可能会变成一个很大的数字
strftime
和t1
之间的年份。
那么,语言律师的问题是:这合法且可移植吗?
呼叫t2
时,strftime
,tm_hour
和其余的
限制在正常范围内吗? (是的,我已经尝试过了,
非规范化的价值观行之有效-一点也不奇怪-
如流行的实现所预期的那样,但这不是
问题。)
[完全公开:我正在将same question发布到tz mailing list。]
答案 0 :(得分:4)
C11标准7.27.3.5/3说:
如果任何指定值超出正常范围,则未指定存储的字符。
我的意思是输入必须被规范化才能使函数正常运行;并且strftime
的一致实现可以通过天真地读取并显示存储在该结构中的值而无需对其进行任何分析来进行操作。