eck*_*kes 8 c time struct mktime
在回答另一个问题时,我告诉OP他需要struct tm正确初始化他的变量,但需要小心,因为他不能简单地使用
struct tm mytime;
memset(&mytime, 0, sizeof(mytime));
Run Code Online (Sandbox Code Playgroud)
因为并非所有领域struct tm都有效0.在仔细一看struct tm给我看,正是一个领域struct tm不具有0作为有效值,即tm_mday:
Run Code Online (Sandbox Code Playgroud)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_sec,tm_min,tm_hour显示成存储从0开始在12小时格式的第一个小时为12从0开始,但其余的可以显示“原样”由从0开始。tm_mday 从1开始显示,所以从1开始存储tm_mon 从1开始显示在1964年2月24日之类的日期中,但是从0开始存储也很有意义,以便于在1964年2月24日这样的日期中为数组中的字符串编制索引,因此可以采用两种方式->从0开始tm_year 20世纪的年份可以按2年格式显示,例如24/02/64,或者加1900,在任何情况下都不应该从1开始tm_wday 通常通过索引从0开始的字符串数组来显示tm_yday 为了清楚起见,没有明确的理由从1开始,从0开始因此tm_mday,在所有常见情况下,从1开始存储它具有明显的优势,这是唯一明显的优点,以便于显示。
的参考实现asctime从C-89标准是与此一致,唯一的调整是任何值的至1900添加到tm_year:
char *asctime(const struct tm *timeptr)
{
static const char wday_name[7][3] = {
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};
static const char mon_name[12][3] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
static char result[26];
sprintf(result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",
wday_name[timeptr->tm_wday],
mon_name[timeptr->tm_mon],
timeptr->tm_mday, timeptr->tm_hour,
timeptr->tm_min, timeptr->tm_sec,
1900 + timeptr->tm_year);
return result;
}
Run Code Online (Sandbox Code Playgroud)
我猜巴比伦人决定1在一个月的第一天使用数字(出于非常明显的原因),因为他们0还没有发明数字。
(与第一年是第一年 AC 的原因相同)
从那时起,没有人改变月份的编号。
| 归档时间: |
|
| 查看次数: |
3372 次 |
| 最近记录: |