VC++任意格式时间字符串转换为CTime类型以及计算时差

13 篇文章 4 订阅
10 篇文章 1 订阅

  在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(""));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坤昱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值