window下时间设置

用了蛮长时间搞出点东西,还被上面鄙视了一番,算了不抱怨了,在鄙视中成长,在鄙视中强大。

我主要是完成两个两个功能:第一个是设置系统时间将其转换成十六进制精确到分钟显示出来(这个VC中有现成的api,以前没搞过MFC现学现用,搞的稀烂,很简单的东西走了很多冤枉路)第二个就是我输入自己的一个时间字符串,然后将其转换成相对于197011000秒的时钟的输出,输出也是十六进制。如下图:


如果是第一个:我就不用输入时钟值,直接调用API函数 time(&timer);然后iMin = time(&timer)/60;因为这个函数返回的时间是相对197011000秒一共的秒数,对60去整得到精确到分钟的分钟数。

如果是第二个:我输入20120424150600,这是一个字符串,系统不会把他当成时钟,所以要想法,直接看代码吧:

BOOL COtpTestDlg::OnTimeTransform() 
{
	// TODO: Add your control notification handler code here
	CString								strTemp;
	SYSTEMTIME							stST = {0};
	ByteArray							baTime;
//	unsigned long int 					iMin;
	
	char                                array[15];
	char                                arrayyear[5];
	char                                arraymonth[3];
	char                                arrayday[3];
	char                                arrayhour[3];
	char                                arraymin[3];
	char                                arraysec[3];
	time_t								timer;
	SYSTEMTIME							m_myLocalTime;
	char								zero[]={0};
	//输入字符串到tmp中
	if(GetDlgItemText(IDC_EDIT_TIME_VALUE,strTemp))
	{
		memset(array,'\0',sizeof(array));
		//将strTmp内容拷贝到array中
		memcpy(array,strTemp.GetBuffer(0),strTemp.GetLength());
		//讲array中填满年月日时分秒
		memcpy(arrayyear,array,sizeof(arrayyear)-1);
		memcpy(arraymonth,array+4,sizeof(arraymonth)-1);
		memcpy(arrayday,array+6,sizeof(arrayday)-1);
		memcpy(arrayhour,array+8,sizeof(arrayhour)-1);
		memcpy(arraymin,array+10,sizeof(arraymin)-1);	
		memcpy(arraysec,array+12,sizeof(arraysec)-1);
		//将array年月日时分秒字符串转化成整数
		m_myLocalTime.wYear = (WORD)atoi(arrayyear);
		m_myLocalTime.wMonth = (WORD)atoi(arraymonth);
		m_myLocalTime.wDay = (WORD)atoi(arrayday);
		m_myLocalTime.wHour = (WORD)atoi(arrayhour);
		m_myLocalTime.wMinute = (WORD)atoi(arraymin);
		m_myLocalTime.wSecond = (WORD)atoi(arraysec);

		if (strTemp.GetLength() != 14)
		{
			AfxMessageBox(_T("输入长度不合法,请重新输入"));
			SetDlgItemText(IDC_EDIT_TIME_VALUE,zero);
			return FALSE;
		}
		else 
			
		{	
			//自定时钟,判断年月日的合法性,因为开发人员不知道输入的字符串是否符合闰年和平年
			if (timeIsVaild(m_myLocalTime.wYear,m_myLocalTime.wMonth,m_myLocalTime.wDay,m_myLocalTime.wHour,m_myLocalTime.wMinute,m_myLocalTime.wSecond))
			{
				CTime tbase(1971,1,1,0,0,0);
				CTime tend(m_myLocalTime);
				CTimeSpan span = tend- tbase;
				//STATIC_TIME是(1971,1,1,0,0,0)与(1970,1,1,0,0,0)并不是365天的分钟数,也不是366天的分钟数,是用巧妙的方法得出来的常数
				//首先用把系统时间设置成m_m_myLocalTime,可以用系统给的接口求出m_m_myLocalTime相对1970的分钟数,再减去span.GetTotalMinutes()
				//就得到STATIC_TIME
				iMin = span.GetTotalMinutes()+STATIC_TIME;
				//讲分钟以十六进制输出
				_itoa(iMin,array,16);
				GetDlgItem(IDC_TIME_TRAN_RESULT)->SetWindowText(array);
				return TRUE;
			}
			return FALSE;
		}
// 		CTime tbase(1971,1,1,0,0,0);
// 		CTime tend(m_myLocalTime);
// 		CTimeSpan span = tend- tbase;
// 		iMin = span.GetTotalMinutes()+STATIC_TIME;	
// 		_itoa(iMin,array,16);
// 		GetDlgItem(IDC_TIME_TRAN_RESULT)->SetWindowText(array);
// 		else
// 			AfxMessageBox(_T("请重新输入"));
	}
	else
	{	
		iMin = time(&timer)/60;
		_itoa(iMin,array,16);
		GetDlgItem(IDC_TIME_TRAN_RESULT)->SetWindowText(array);	
		return TRUE;
	}
}

BOOL COtpTestDlg ::isLeapYear( WORD year )
{
//  if (year%400 == 0 || (year%4 == 0 && year%100 != 0))
// 
// 	return TRUE;
// 
// 	return FALSE;
	if (year%400 == 0 || (year%4 == 0 && year%100 != 0))
	{
		return TRUE;
	}
	return FALSE;
}

//时钟合法性判断
BOOL COtpTestDlg :: timeIsVaild(WORD wYear, WORD wMonth, WORD wDay, WORD wHour, WORD wMinute, WORD wSecond )
{	
	char								zero[14]={0};
//天数判断
	switch(wMonth)
	{
		case 1: case 3: case 5: case 7: case 8: case 10: case 12:
					{
						if (wDay > 31)
						{
							AfxMessageBox(_T("天数不合法,请重新输入"));
							SetDlgItemText(IDC_EDIT_TIME_VALUE,zero);
							return FALSE;
						}
						break;
					}
		case 2:
					{
						if (isLeapYear(wYear))
						{
							if (wDay > 29)
							{
								AfxMessageBox(_T("天数不合法,请重新输入"));
								SetDlgItemText(IDC_EDIT_TIME_VALUE,zero);
								return FALSE;
							}
							break;
						}
						else
						{
							if(wDay > 28)
							{
								AfxMessageBox(_T("天数不合法,请重新输入"));
								SetDlgItemText(IDC_EDIT_TIME_VALUE,zero);
								return FALSE;
							}
							break;
						}
					}
		case 4: case 6: case 9: case 11:
					{
						if (wDay > 30)
						{
							AfxMessageBox(_T("天数不合法,请重新输入"));
							SetDlgItemText(IDC_EDIT_TIME_VALUE,zero);
							return FALSE;
						}
						break;
					}
		default:
					
			{
				AfxMessageBox(_T("月份不合法,请重新输入"));
				SetDlgItemText(IDC_EDIT_TIME_VALUE,zero);
				return FALSE;
			}
	}
	//小时分钟秒的判断
	if (wHour > 23 || wMinute > 59 || wSecond > 59)
	{
		AfxMessageBox(_T("时分秒不合法,请重新输入"));
		SetDlgItemText(IDC_EDIT_TIME_VALUE,zero);
		return FALSE;
	}

	return TRUE;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值