一个日期输入输出的问题

allforly 2003-09-22 05:37:55
time_t CDate(char *str){
int y=0,n=0,d=0,h=0,m=0,s=0;
struct tm outime;
sscanf(str, "%4d%2d%2d%2d%2d%2d", &y, &n, &d, &h, &m, &s);
outime.tm_year = y-1900;
outime.tm_mon = n-1;
outime.tm_mday = d;
outime.tm_hour = h;
outime.tm_min = m;
outime.tm_sec = s;
return mktime(&outime);
}

int DateDiff(char *interval, time_t start_time, time_t end_time){
int diff = start_time-end_time;
if (!strcmp(interval,"year"))
return diff/(365*24*60*60);
else if (!strcmp(interval,"month"))
return (diff/(365*24*60*60))*12;
else if (!strcmp(interval,"day"))
return diff/(24*60*60);
else if (!strcmp(interval,"hour"))
return diff/(60*60);
else if (!strcmp(interval,"minute"))
return diff/60;
else if (!strcmp(interval,"second"))
return diff;
else
return 0;
}

情况1:
int main(){
time_t timer[3];
struct tm *outime[3];
int h,m,s,MTDay=21;
char regtime[] = "20030919115851";
char buf[MSGMAXLENGTH];
timer[0] = time(NULL);
timer[1] = CDate(regtime);
outime[0] = localtime(&timer[0]);
outime[1] = localtime(&timer[1]);
sscanf(MTTime, "%2d:%2d:%2d", &h, &m, &s);
sprintf(buf, "%04d%02d%02d%02d%02d%02d", outime[0]->tm_year+1900, outime[0]->tm_mon+1, MTDay, h, m, s);
cout<<buf<<endl;
timer[2] = CDate(buf);
outime[2] = localtime(&timer[2]);
cout<<asctime(outime[0]);
cout<<asctime(outime[1]);
cout<<asctime(outime[2]);
cout<<DateDiff("hour", timer[0], timer[1])<<endl;
cout<<DateDiff("second", timer[0], timer[2])<<endl;
return 0;
}

输出结果:
200309210125601
Sun Sep 21 00:26:00 2003
Sun Sep 21 00:26:00 2003
Sun Sep 21 00:26:00 2003
78
147322

情况2:
int main(){
time_t timer[3];
struct tm *outime[3];
int h,m,s,MTDay=21;
char regtime[] = "20030919115851";
char buf[MSGMAXLENGTH];
timer[0] = time(NULL);
timer[1] = CDate(regtime);
outime[0] = localtime(&timer[0]);
cout<<asctime(outime[0]);
outime[1] = localtime(&timer[1]);
cout<<asctime(outime[1]);
sscanf(MTTime, "%2d:%2d:%2d", &h, &m, &s);
sprintf(buf, "%04d%02d%02d%02d%02d%02d", outime[0]->tm_year+1900, outime[0]->tm_mon+1, MTDay, h, m, s);
cout<<buf<<endl;
timer[2] = CDate(buf);
outime[2] = localtime(&timer[2]);
cout<<asctime(outime[2]);
cout<<DateDiff("hour", timer[0], timer[1])<<endl;
cout<<DateDiff("second", timer[0], timer[2])<<endl;
return 0;
}

输出结果:
Mon Sep 22 17:21:50 2003
Fri Sep 19 10:58:51 2003
200309210125601
Sun Sep 21 00:26:00 2003
78
147350

情况3:
int main(){
time_t timer[3];
struct tm *outime[3];
int h,m,s,MTDay=21;
char regtime[] = "20030919115851";
char buf[MSGMAXLENGTH];
timer[0] = time(NULL);
timer[1] = CDate(regtime);
outime[0] = localtime(&timer[0]);
outime[1] = localtime(&timer[1]);
sscanf(MTTime, "%2d:%2d:%2d", &h, &m, &s);
sprintf(buf, "%04d%02d%02d%02d%02d%02d", outime[0]->tm_year+1900, outime[0]->tm_mon+1, MTDay, h, m, s);
cout<<buf<<endl;
timer[2] = CDate(buf);
outime[2] = localtime(&timer[2]);
cout<<asctime(localtime(&timer[0]));
cout<<asctime(localtime(&timer[1]));
cout<<asctime(localtime(&timer[2]));
cout<<DateDiff("hour", timer[0], timer[1])<<endl;
cout<<DateDiff("second", timer[0], timer[2])<<endl;
return 0;
}

输出结果:
200309210125601
Mon Sep 22 17:24:12 2003
Fri Sep 19 10:58:51 2003
Sun Sep 21 00:26:00 2003
78
147492

这是怎么回事情呢,难道struct tm *outime[3]没有赋值,相邻的输出就会产生数据溢出了?可是为什么直接用asctime(localtime(&timer[0]))就可以了呢。
问题大大的有,头都大了
...全文
92 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧