在MFC中使用CTime类获取到时间字符串比较方便、简洁。如果使用不规则时间字符串转换为CTime及相关的类型却不太常见,为此我根据需要动手封装了三个函数(函数一:不规则时间字符串转换为CTime类型,函数二:时间转换为相应字符串(比如1转换为"1天"),函数三:格式化输出时间差字符串)。
首先参考一个不规则时间字符串:
"2017-01!月-15日,12时,10分-03"
下面是函数定义部分:
//不规则字符串转换为Ctime类对象
CTime FormatTime(CString Strtime);
//时间转换为字符串
//第一个参数 指定时间 比如time.GetDays()等
//第二个参数 时间标志 比如 天,小时等
CString GetValidData(int nVal,CString Str);
//获取两个不规格字符串的时间差
//第一个参数 以前的时间(被减的时间)
//第二个参数 现在的时间 可以输入任意时间字符串(默认值为当前获取到的时间)
CString GetTimeLag(CString BeforeTime,CString CurrentTime = _T(""));
函数实现部分:
//不规则字符串转换为Ctime类对象
CTime FormatTime(CString Strtime)
{
int nTime[6] = {0};
char *StrData = new char[sizeof(char) * 256];
memset(StrData,0,sizeof(StrData));
memcpy(StrData,Strtime.GetBuffer(),Strtime.GetLength());
Strtime.ReleaseBuffer();
StrData[Strtime.GetLength()] = 0;
int nNum = 0;
char StrTemp[20] = {0};
int nVal = 0;
while (0 != *StrData || 0 != nVal)
{
if ('0' <= *StrData && '9' >= *StrData)
{
StrTemp[nVal++] = *StrData;
++StrData;
}
else
{
if (0 != *StrTemp)
{
nTime[nNum++] = atoi(StrTemp);
}
nVal = 0;
memset(StrTemp,0,sizeof(StrTemp));
++StrData;
}
}
if (0 == nTime[0] && 0 == nTime[1] && 0 == nTime[2] && 0 == nTime[3] && 0 == nTime[4]
&& 0 == nTime[5])
{
return NULL;
}
return CTime(nTime[0],nTime[1],nTime[2],nTime[3],nTime[4],nTime[5]);
}
//时间转换为字符串
CString GetValidData(int nVal,CString Str)
{
if (0 == nVal)
{
return _T("");
}
CString StrTime;
StrTime.Format(_T("%d%s"),nVal,Str);
return StrTime;
}
//获取两个不规格字符串的时间差
CString GetTimeLag(CString BeforeTime,CString CurrentTime)
{
if (BeforeTime.IsEmpty())
{
return _T("");
}
CTimeSpan time;
if (CurrentTime.IsEmpty())
{
time = CTime::GetCurrentTime() - FormatTime(BeforeTime);
}
else
{
time = FormatTime(CurrentTime) - FormatTime(BeforeTime);
}
CString StrVal;
StrVal += (GetValidData(time.GetDays(),_T("天")) + GetValidData(time.GetHours(),_T("小时"))
+ GetValidData(time.GetMinutes(),_T("分钟")) + GetValidData(time.GetSeconds(),_T("秒")));
return StrVal;
}
下面展示一个测试用例:
CString Str = GetTimeLag(_T("2017-01!月-15日,12时,10分-03"),_T(""));