用了蛮长时间搞出点东西,还被上面鄙视了一番,算了不抱怨了,在鄙视中成长,在鄙视中强大。
我主要是完成两个两个功能:第一个是设置系统时间将其转换成十六进制精确到分钟显示出来(这个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 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;
}