给美国的客户做的软件,测试是在去年冬天,一切顺利。前段时间,测试人员突然报了一个BUG,说他们配置了一个时间参数,输入的值是2013-03-27 22:30:00,但是在运行过程中,软件显示确却是2013-03-27 23:30:00,整整快了一个小时。但是别的时间,比如2013-01-27 22:30:00,却没有问题。
当时想了想,立即觉得可能与夏令时有关系,于是赶把相关的函数调用单独拿出来测试了一下,果然如此。至于DST的概念,请大家自己去google吧。
这里的经验教训有如下两点:
1. 如果你的代码使用了mktime(struct tm * timeptr),并且你的代码可能会运行在DST可能实行的环境中,那么最好在你调用mktime之前将timeptr->tm_isdat设置为-1。
0: 不考虑DST时间;
1: 考虑DST时间;
-1: 操作系统根据当前系统设置决定是否使用DST时间;
2. 如果代码使用了当地时间进行逻辑调度,并且软件可能会运行在DST可能实行的环境中,那么一定要有相应的DST测试用例覆盖。因为这样的场景极有可能出现:软件测试在是在冬天,而客户是在夏天才开始使用软件的,一运行就发现如此刺眼的BUG,该多么扫兴啊。
======================================================================================================
Code:
#include "time.h"
#include "stdio.h"
#include <string.h>
int main(void)
{
const int nBufferlen = 64;
char szBufferA[nBufferlen] = {0};
char szBufferB[nBufferlen] = {0};
struct tm tmA;
struct tm tmA_reverse;
struct tm tmB;
struct tm tmB_reverse;
memset(&tmA, 0, sizeof(tmA));
memset(&tmA_reverse, 0, sizeof(tmA_reverse));
memset(&tmB, 0, sizeof(tmB));
memset(&tmB_reverse, 0, sizeof(tmB_reverse));
time_t ltA=0;
time_t ltB=0;
// 2013-03-27 22:30:00
tmA.tm_year = 113;
tmA.tm_mon = 2;
tmA.tm_mday = 27;
tmA.tm_hour = 22;
tmA.tm_min = 30;
tmA.tm_sec = 0;
// Your attention here
tmA.tm_isdst = 0;
tmB = tmA;
tmB.tm_isdst = -1;
ltA=mktime(&tmA);
ltB=mktime(&tmB);
localtime_r(<A, &tmA_reverse);
localtime_r(<B, &tmB_reverse);
strftime(szBufferA, nBufferlen, "%Y-%m-%d %H:%M:%S", &tmA);
strftime(szBufferB, nBufferlen, "%Y-%m-%d %H:%M:%S", &tmB);
printf("\nltA: %d tmA_reverse: %s", ltA, szBufferA);
printf("\nltB: %d tmB_reverse: %s\n\n", ltB, szBufferB);
return 0;
}
Output


本文介绍了在Linux环境下,C/C++编程中如何处理夏令时(DST)的问题。强调在使用当地时间进行逻辑调度的代码中,必须考虑DST的影响,并提供测试用例以确保在不同季节的正确运行。示例代码展示了如何使用`mktime`和`localtime_r`函数处理DST转换。

569

被折叠的 条评论
为什么被折叠?



