根据标准,mktime
应该执行标准化 - 当您想要向struct tm
添加一分半时,您需要向tm_sec
添加90秒并致电mktime
,忽略其回报价值。
我在标准中未找到的是参数是否已标准化,即使它无法在time_t
中表示(例如将年份设置为2100)。
那么,这段代码安全吗?
struct tm future;
memset(&future, 0, sizeof(future));
future.tm_mon = 1;
future.tm_sec = 90; //I want this to be normalised by mktime
future.tm_year = 200; //but this can cause troubles
mktime(&future);
//future.tm_sec should be 30
//future.tm_min should be 1
//future.tm_year should be still 200
答案 0 :(得分:1)
C标准对此有mktime()
:
成功完成后,结构的
tm_wday
和tm_yday
组件的值会相应设置,并且 其他组件设置为表示指定的日历时间,但是 他们的价值被迫达到上述范围;决赛tm_mday
和tm_mon
之前未设置tm_year
的值 确定。
因此,如果函数成功完成,您只能依赖正在执行的规范化。
答案 1 :(得分:0)
您需要检查mktime
的返回值。 你不应该忽略库函数的返回值!(printf
的例外情况和其他很少的情况)。
如果它返回(time_t)-1
,则结果不值得信任。
请参阅http://codepad.org/KTZwUHt0
上的示例我电脑上的相同代码打印
time_t is 64 bits long normalized to 2100-01-31 T 00:01:30