其中Convert函数是把将tm格式的时间转化为string格式。
分析代码,原因是当操作系统(IBM AIX)采用的是夏令时,当调用isValid函数传入一个时间值,而初始化结构体struct tm tm1时候将m_tm->tm_isdst设置成了0(0表示夏令时无效,1表示夏令时有效),调用strToTime之后,tm1中的内容被修改。
经过测试,发现mktime会根据操作系统是否是夏令时对m_tm进行调整:
1、 如果操作系统是夏令时,而tm1->tm_isdst不是夏令时标记时,tm1的时间会往前调一个小时,同时修改tm1->tm_isdst为夏令时标记;
2、 如果操作系统是夏令时,而tm1->tm_isdst是夏令时标记时,不会有影响;
3、 如果操作系统是非夏令时,不管tm1->tm_isdst是夏令时标记还是非夏令时标记,都不会有影响。
可以看出,strToTime函数中的mktime造成tm1的内容变动,导致szIn和szTmp不一致。
3 结论:解决方案及效果
两种解决方案:
1、 修改操作系统的时区,使其不是夏令时;
2、 在调用mktime之前,先获取当前系统的夏令时设置。
将代码中蓝色字体处修改为:
time_t iRst;
time(&iRst);
struct tm *pf = localtime(&iRst);
struct tm tm1 = {0,0,0,0,0,0,0,pf-> tm_isdst};
两种方案修改后,函数处理均正常。
4 经验总结:预防措施和规范建议
在使用时间处理函数时,需要了解该函数是否和时区和夏令时有关。如果相关,需要了解系统当前的时区和夏令时,考虑不同时区和夏令时对函数的影响。若出问题,时区和夏令时是一个可以考虑出问题的地方。
5 备注
6 考核点
夏令时和时区对程序的影响。
7 试题
下面程序说法正确的是:(B,D)
#include
#include
int main()
{
time_t iRst;
struct tm *pf;
time(&iRst);
pf = localtime(&iRst);
printf("beforer tran:%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
pf->tm_year+1900, pf->tm_mon+1, pf->tm_mday, pf->tm_hour,
pf->tm_min, pf->tm_sec, pf->tm_wday, pf->tm_yday, pf->tm_isdst);
pf->tm_isdst=0;
iRst = mktime(pf);
pf = localtime(&iRst);
printf("after tran:%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
pf->tm_year+1900, pf->tm_mon+1, pf->tm_mday, pf->tm_hour,
pf->tm_min, pf->tm_sec, pf->tm_wday, pf->tm_yday, pf->tm_isdst);
return 0;
}
A. 当系统当前是非夏令时时候,程序运行结果beforer tran和after tran的值不一致;
B. 当系统当前是非夏令时时候,程序运行结果beforer tran和after tran的值一致;
C. 当系统当前是夏令时时候,程序运行结果beforer tran和after tran的值一致;
D. 当系统当前是夏令时时候,程序运行结果beforer tran和after tran的值不一致
阅读(450) | 评论(0) | 转发(0) |