Chinaunix首页 | 论坛 | 博客
  • 博客访问: 573778
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 18:17:41

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调用并没有影响第一次调用返回的结果。
阅读(428) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~