【发布时间】:2015-10-01 13:14:54
【问题描述】:
answering another question 时,我告诉 OP 他需要正确初始化他的struct tm 变量,但需要小心,因为他不能简单地使用
struct tm mytime;
memset(&mytime, 0, sizeof(mytime));
因为 并非所有 struct tm 的字段从 0 开始都有效。 A closer look on struct tm 向我展示了 struct tm 的 一个 字段没有 0 作为有效值,即 tm_mday:
int tm_sec seconds [0,61] int tm_min minutes [0,59] int tm_hour hour [0,23] int tm_mday day of month [1,31] int tm_mon month of year [0,11] int tm_year years since 1900 int tm_wday day of week [0,6] (Sunday = 0) int tm_yday day of year [0,365] int tm_isdst daylight savings flag
为什么?决定对于这个元素,0 不应该是有效值的决定背后的想法是什么???
【问题讨论】:
-
tm_year也是从 1 开始(没有年份“零”),只是减少了 1900,这可能掩盖了零的缺失。 ;) 通常所有值都有最适合直接显示(小时..秒)或索引字符串数组(月)的范围。 -
@CiaPan:
indexing string arrays听起来很合理,但是,tm_yday没有字符串索引,0是有效的。 -
@CiaPan
tm_year为零很好:这意味着年份1900。 -
我不知道这是否是基本原理的一部分,但如果
tm_mday从 1 开始,要找到下一个/上一个星期日,你只需要做tm_mday - tm_wday(和±7),等等,所以它允许相对“干净”的公式。 -
只是一些猜测。秒、分钟、小时、月、年有固定的转换,但天没有。例如。 1m = 60s; 1h = 60m; 1 个月 = ???日; 1y = 12m。所以,你可以使用
mod到 s/m/h/y,比如x mod 60s,'x mod 60m','x mod 60h',x mod 12m,这可能会产生0s ,0m,0h 结果。但我们不会将mod应用于当天,例如x mod ??? day(base is 30 ?31 ? or 29 ?)。