1 现象:问题描述
程序应该输出的时间为:Thu Jan 11 08:01:00 2006,但实际输出时间为:Thu Jan 11 09:25:00 2006。输出的时间与实际时间不符。
2 关键过程:根本原因分析
时间格式化采用localtime函数,由于localtime内部会保留一份tm结构的静态变量,所有localtime的调用都会改变这个变量的值,从而导致输出的格式化后的时间和实际时间不符。
示例如下:
time_t firstTime,secondTime;
tm* firstTm;
tm* secondTm;
time(&firstTime);
firstTm = localtime_r(&firstTime);
printf("firstTm = %s\n",asctime(firstTm));
Sleep(10000);
time(&secondTime);
secondTm = localtime(&secondTime);
printf("secondTm = %s\n",asctime(secondTm));
printf("firstTm = %s\n",asctime(firstTm));
输出结果为:
firstTm = Mon Jul 17 11:02:03 2006
secondTm = Mon Jul 17 11:02:13 2006
firstTm = Mon Jul 17 11:02:13 2006
从输出结果中可以看出:当第二次调用localtime后,firstTm的值已经改变。
3 结论:解决方案及效果
为避免后续的localtime调用影响以前的值,需要在每次调用后,在本地保存全局tm结构的拷贝。
time_t firstTime,secondTime;
tm firstTm;
tm secondTm;
time(&firstTime);
firstTm = *localtime(&firstTime);
printf("firstTm = %s\n",asctime(&firstTm));
Sleep(10000);
time(&secondTime);
secondTm = *localtime(&secondTime);
printf("secondTm = %s\n",asctime(&secondTm));
printf("firstTm = %s\n",asctime(&firstTm));
输出结果为:
firstTm = Mon Jul 17 11:14:20 2006
secondTm = Mon Jul 17 11:14:30 2006
firstTm = Mon Jul 17 11:14:20 2006
可以看出:第二次的localtime调用并没有影响第一次调用返回的结果。
阅读(422) | 评论(0) | 转发(0) |