📄 goodtime.cpp
字号:
if (ptm != NULL)
{
*ptm = m_time;
}
// Make a static copy
s_time = m_time;
return &s_time;
}
#ifdef _DEBUG
CDumpContext& AFXAPI operator <<(CDumpContext& dc, CGoodTime time)
{
if ( time.m_time.tm_mday == 0 )
return dc << "CGoodTime(invalid)";
CString sTime = time.Format( "%a %b %d %H:%M:%S %Y" );
return dc << "CGoodTime(\"" << sTime << "\")";
}
#endif
CArchive& AFXAPI operator <<(CArchive& ar, CGoodTime time)
{
ar << time.m_time.tm_sec;
ar << time.m_time.tm_min;
ar << time.m_time.tm_hour;
ar << time.m_time.tm_mday;
ar << time.m_time.tm_mon;
ar << time.m_time.tm_year;
ar << time.m_time.tm_wday;
ar << time.m_time.tm_yday;
return ar << time.m_time.tm_isdst;
}
CArchive& AFXAPI operator >>(CArchive& ar, CGoodTime& rtime)
{
ar >> rtime.m_time.tm_sec;
ar >> rtime.m_time.tm_min;
ar >> rtime.m_time.tm_hour;
ar >> rtime.m_time.tm_mday;
ar >> rtime.m_time.tm_mon;
ar >> rtime.m_time.tm_year;
ar >> rtime.m_time.tm_wday;
ar >> rtime.m_time.tm_yday;
return ar >> rtime.m_time.tm_isdst;
}
/////////////////////////////////////////////////////////////////////////////
// String formatting
#define maxTimeBufferSize 520
#define safeTimeBufferSize 500
CString CGoodTime::Format(LPCTSTR pFormat) const
{
TCHAR szBuffer[maxTimeBufferSize];
TCHAR ch;
LPTSTR pch = szBuffer;
while ((ch = *pFormat++) != '\0')
{
ASSERT(pch < &szBuffer[safeTimeBufferSize]);
// Just because we've asserted it doesn't always make it true;
// The code below may put us over the safe buffer size. If
// we aren't to the safe-point yet, anything below will fit.
if ( pch >= &szBuffer[safeTimeBufferSize] )
{
return "";
}
if (ch == '%')
{
switch (ch = *pFormat++)
{
default:
ASSERT(FALSE); // probably a bad format character
case '%':
*pch++ = ch;
break;
case 'a':
{
char szDays[7][4] = {
"Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat"
};
lstrcpy( pch, szDays[m_time.tm_wday] );
pch += lstrlen( szDays[m_time.tm_wday] );
}
break;
case 'A':
{
char szDays[7][10] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};
lstrcpy( pch, szDays[m_time.tm_wday] );
pch += lstrlen( szDays[m_time.tm_wday] );
}
break;
case 'b':
{
char szMonths[12][4] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
};
lstrcpy( pch, szMonths[m_time.tm_mon] );
pch += lstrlen( szMonths[m_time.tm_mon] );
}
break;
case 'B':
{
char szMonths[12][10] = {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
lstrcpy( pch, szMonths[m_time.tm_mon] );
pch += lstrlen( szMonths[m_time.tm_mon] );
}
break;
case 'c':
{
pch += wsprintf(pch, _T("%02d/%02d/%02d %02d:%02d:%02d"),
m_time.tm_mon + 1,
m_time.tm_mday,
(m_time.tm_year % 100),
m_time.tm_hour,
m_time.tm_min,
m_time.tm_sec );
}
break;
case 'd':
pch += wsprintf(pch, _T("%02d"), m_time.tm_mday);
break;
case 'H':
pch += wsprintf(pch, _T("%02d"), m_time.tm_hour);
break;
case 'I':
pch += wsprintf(pch, _T("%02d"), (m_time.tm_hour%13)+((m_time.tm_hour>12)?1:0));
break;
case 'j':
pch += wsprintf(pch, _T("%03d"), m_time.tm_yday+1);
break;
case 'm':
pch += wsprintf(pch, _T("%02d"), m_time.tm_mon+1);
break;
case 'M':
pch += wsprintf(pch, _T("%02d"), m_time.tm_min);
break;
case 'p':
pch += wsprintf(pch, _T("%s"), ((m_time.tm_hour > 12)?"PM":"AM"));
break;
case 'S':
pch += wsprintf(pch, _T("%02d"), m_time.tm_sec);
break;
case 'U':
case 'W':
{
int wdaytemp;
int temp;
if ( ch == 'W' )
{
if (m_time.tm_wday == 0) /* monday based */
wdaytemp = 6;
else
wdaytemp = m_time.tm_wday-1;
}
else
{
wdaytemp = m_time.tm_wday;
}
if (m_time.tm_yday < wdaytemp)
{
temp=0;
}
else
{
temp = m_time.tm_yday/7;
if ((m_time.tm_yday%7) >= wdaytemp)
temp++;
}
pch += wsprintf(pch, _T("%02d"), temp);
}
break;
case 'w':
pch += wsprintf(pch, _T("%d"), m_time.tm_wday);
break;
case 'x':
pch += wsprintf(pch, _T("%02d/%02d/%02d"),
m_time.tm_mon + 1,
m_time.tm_mday,
(m_time.tm_year % 100) );
break;
case 'X':
pch += wsprintf(pch, _T("%02d:%02d:%02d"),
m_time.tm_hour,
m_time.tm_min,
m_time.tm_sec );
break;
case 'y':
pch += wsprintf(pch, _T("%02d"), (m_time.tm_year%100));
break;
case 'Y':
pch += wsprintf(pch, _T("%04d"), m_time.tm_year+1900);
break;
case 'z':
case 'Z':
_tzset();
lstrcpy( pch, _tzname[((m_time.tm_isdst)?1:0)] );
pch += lstrlen(_tzname[((m_time.tm_isdst)?1:0)]);
break;
}
}
else
{
*pch++ = ch;
if (_istlead(ch))
{
ASSERT(pch < &szBuffer[maxTimeBufferSize]);
*pch++ = *pFormat++;
}
}
}
*pch = '\0';
return szBuffer;
}
CString CGoodTime::FormatGmt(LPCTSTR pFormat) const
{
CGoodTime gmtTime( *GetGmtTm(NULL) );
return gmtTime.Format(pFormat);
}
CString CGoodTime::Format(UINT nFormatID) const
{
CString strFormat;
VERIFY(strFormat.LoadString(nFormatID) != 0);
return Format(strFormat);
}
CString CGoodTime::FormatGmt(UINT nFormatID) const
{
CString strFormat;
VERIFY(strFormat.LoadString(nFormatID) != 0);
return FormatGmt(strFormat);
}
#ifdef _UNICODE
// These functions are provided for compatibility with MFC 3.x
CString CGoodTime::Format(LPCSTR pFormat) const
{
CString strFormat(pFormat);
return Format((LPCTSTR)strFormat);
}
CString CGoodTime::FormatGmt(LPCSTR pFormat) const
{
CString strFormat(pFormat);
return FormatGmt((LPCTSTR)strFormat);
}
CString CTimeSpan::Format(LPCSTR pFormat) const
{
CString strFormat = pFormat;
return Format((LPCTSTR)strFormat);
}
#endif // _UNICODE
////////////////////////////////////////////////////////////////////////////
// out-of-line inlines for binary compatibility
#ifdef _AFXDLL
#ifndef _DEBUG
CGoodTime::CGoodTime()
{ }
CGoodTime::CGoodTime(const CGoodTime& timeSrc)
{ m_time = timeSrc.m_time; }
#endif
#endif
/////////////////////////////////////////////////////////////////////////////
BOOL CGoodTime::operator==(CGoodTime time) const
{
if ( ( m_time.tm_sec == time.m_time.tm_sec ) &&
( m_time.tm_min == time.m_time.tm_min ) &&
( m_time.tm_hour == time.m_time.tm_hour ) &&
( m_time.tm_mday == time.m_time.tm_mday ) &&
( m_time.tm_mon == time.m_time.tm_mon ) &&
( m_time.tm_year == time.m_time.tm_year ) &&
( m_time.tm_wday == time.m_time.tm_wday ) &&
( m_time.tm_yday == time.m_time.tm_yday ) &&
( m_time.tm_isdst == time.m_time.tm_isdst ) )
{
return TRUE;
}
else
{
return FALSE;
}
}
BOOL CGoodTime::operator!=(CGoodTime time) const
{
return ((*this == time) ? FALSE : TRUE);
}
BOOL CGoodTime::operator<(CGoodTime time) const
{
if ( m_time.tm_year < time.m_time.tm_year )
{
return TRUE;
}
else
{
double dThisSeconds = (m_time.tm_yday * (24 * 60 * 60))
+ (m_time.tm_hour * (60 * 60))
+ (m_time.tm_min * 60)
+ m_time.tm_sec;
double dCmpSeconds = (time.m_time.tm_yday * (24 * 60 * 60))
+ (time.m_time.tm_hour * (60 * 60))
+ (time.m_time.tm_min * 60)
+ time.m_time.tm_sec;
return ( dThisSeconds < dCmpSeconds );
}
}
BOOL CGoodTime::operator>(CGoodTime time) const
{
if ( m_time.tm_year > time.m_time.tm_year )
{
return TRUE;
}
else
{
double dThisSeconds = (m_time.tm_yday * (24 * 60 * 60))
+ (m_time.tm_hour * (60 * 60))
+ (m_time.tm_min * 60)
+ m_time.tm_sec;
double dCmpSeconds = (time.m_time.tm_yday * (24 * 60 * 60))
+ (time.m_time.tm_hour * (60 * 60))
+ (time.m_time.tm_min * 60)
+ time.m_time.tm_sec;
return ( dThisSeconds > dCmpSeconds );
}
}
BOOL CGoodTime::operator<=(CGoodTime time) const
{
return ((*this < time) || (*this == time));
}
BOOL CGoodTime::operator>=(CGoodTime time) const
{
return ((*this > time) || (*this == time));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -