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
您将看到的数字范围
打印是由 localtime
或 gmtime
刚刚创建的。
我的问题涉及是否存在要求
strftime
引用的 struct tm
必须
一个刚刚由 localtime
或 gmtime
生成的。我不认为有
这样的要求,但如果没有,那些符号“(00-23)”
和“(00-59)”对
strftime——它们更像是对值的错误要求
由 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
和
strftime
为我将差异转换为 HH:MM:SS 格式。
但如果时间增量超过一天,我就不会打印它
作为天数;我只是把它和时间混为一谈(这是真的,
如果有几个月或
t1
和 t2
之间的年数)。
所以,语言律师问题:这合法且可移植吗?
调用strftime
时,是tm_hour
,tm_min
,其余
是否限制在他们的正常范围内? (是的,我试过了,
非标准化值起作用——一点也不奇怪——
正如流行的实现所预期的那样,但事实并非如此
问题。)
[全面披露:我正在发布 same question到 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
的一致实现可能会通过简单地读取和显示存储在结构中的值而不对它们执行任何分析来运行。
关于c - strftime 和非标准化日期/时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51145727/