用了蛮长时间搞出点东西,还被上面鄙视了一番,算了不抱怨了,在鄙视中成长,在鄙视中强大。
我主要是完成两个两个功能:第一个是设置系统时间将其转换成十六进制精确到分钟显示出来(这个VC中有现成的api,以前没搞过MFC现学现用,搞的稀烂,很简单的东西走了很多冤枉路)第二个就是我输入自己的一个时间字符串,然后将其转换成相对于1970年1月1日0时0分0秒的时钟的输出,输出也是十六进制。如下图:
如果是第一个:我就不用输入时钟值,直接调用API函数 time(&timer);然后iMin = time(&timer)/60;因为这个函数返回的时间是相对1970年1月1日0时0分0秒一共的秒数,对60去整得到精确到分钟的分钟数。
如果是第二个:我输入20120424150600,这是一个字符串,系统不会把他当成时钟,所以要想法,直接看代码吧:
BOOL COtpTestDlg::OnTimeTransform()
{// TODO: Add your control notification handler code hereCString 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_TIMEiMin = 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;
}