|
|
1.1 ! root 1: // This is a part of the Microsoft Foundation Classes C++ library. ! 2: // Copyright (C) 1992 Microsoft Corporation ! 3: // All rights reserved. ! 4: // ! 5: // This source code is only intended as a supplement to the ! 6: // Microsoft Foundation Classes Reference and Microsoft ! 7: // QuickHelp documentation provided with the library. ! 8: // See these sources for detailed information regarding the ! 9: // Microsoft Foundation Classes product. ! 10: ! 11: #ifdef _WINDOWS ! 12: #include "afxwin.h" ! 13: #else ! 14: #include "afx.h" ! 15: #endif ! 16: #pragma hdrstop ! 17: ! 18: #ifdef AFX_CORE_SEG ! 19: #pragma code_seg(AFX_CORE_SEG) ! 20: #endif ! 21: ! 22: #ifdef _DEBUG ! 23: #undef THIS_FILE ! 24: static char BASED_CODE THIS_FILE[] = __FILE__; ! 25: #endif ! 26: ! 27: #ifdef _WINDOWS ! 28: #define sprintf wsprintf ! 29: #endif //_WINDOWS ! 30: ! 31: ! 32: ///////////////////////////////////////////////////////////////////////////// ! 33: // CTime - absolute time ! 34: ! 35: CTime::CTime(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec) ! 36: { ! 37: struct tm atm; ! 38: atm.tm_sec = nSec; ! 39: atm.tm_min = nMin; ! 40: atm.tm_hour = nHour; ! 41: ASSERT(nDay >= 1 && nDay <= 31); ! 42: atm.tm_mday = nDay; ! 43: ASSERT(nMonth >= 1 && nMonth <= 12); ! 44: atm.tm_mon = nMonth - 1; // tm_mon is 0 based ! 45: ASSERT(nYear >= 1900); ! 46: atm.tm_year = nYear - 1900; // tm_year is 1900 based ! 47: atm.tm_isdst = -1; ! 48: m_time = mktime(&atm); ! 49: ASSERT(m_time != -1); // indicates an illegal input time ! 50: } ! 51: ! 52: CTime::CTime(WORD wDosDate, WORD wDosTime) ! 53: { ! 54: struct tm atm; ! 55: atm.tm_sec = (wDosTime & ~0xFFE0) << 1;; ! 56: atm.tm_min = (wDosTime & ~0xF800) >> 5; ! 57: atm.tm_hour = wDosTime >> 11; ! 58: ! 59: atm.tm_mday = wDosDate & ~0xFFE0; ! 60: atm.tm_mon = ((wDosDate & ~0xFE00) >> 5) - 1; ! 61: atm.tm_year = (wDosDate >> 9) + 80; ! 62: atm.tm_isdst = -1; ! 63: m_time = mktime(&atm); ! 64: ASSERT(m_time != -1); // indicates an illegal input time ! 65: } ! 66: ! 67: #ifdef _NTWIN ! 68: CTime::CTime(const _SYSTEMTIME& sysTime) ! 69: { ! 70: if (sysTime.wYear < 1900) ! 71: { ! 72: time_t time0 = 0L; ! 73: CTime timeT(time0); ! 74: *this = timeT; ! 75: } ! 76: else ! 77: { ! 78: CTime timeT( ! 79: (int)sysTime.wYear, ! 80: (int)sysTime.wMonth, ! 81: (int)sysTime.wDay, ! 82: (int)sysTime.wHour, ! 83: (int)sysTime.wMinute, ! 84: (int)sysTime.wSecond ! 85: ); ! 86: *this = timeT; ! 87: } ! 88: } ! 89: ! 90: CTime::CTime(const _FILETIME& fileTime) ! 91: { ! 92: _SYSTEMTIME sysTime; ! 93: VERIFY(FileTimeToSystemTime((LPFILETIME)&fileTime, (LPSYSTEMTIME)&sysTime)); ! 94: CTime timeT(sysTime); ! 95: *this = timeT; ! 96: } ! 97: #endif ! 98: ! 99: CTime ! 100: CTime::GetCurrentTime() ! 101: /* ! 102: -- return the current system time ! 103: */ ! 104: { ! 105: return CTime(::time(NULL)); ! 106: } ! 107: ! 108: struct tm* ! 109: CTime::GetGmtTm(struct tm* ptm /* = NULL */) const ! 110: /* ! 111: -- note uses global static buffer ! 112: */ ! 113: { ! 114: if (ptm != NULL) ! 115: return &(*ptm = *gmtime(&m_time)); ! 116: else ! 117: return gmtime(&m_time); ! 118: } ! 119: ! 120: struct tm* ! 121: CTime::GetLocalTm(struct tm* ptm /* = NULL */) const ! 122: /* ! 123: -- note uses global static buffer ! 124: */ ! 125: { ! 126: if (ptm != NULL) ! 127: return &(*ptm = *localtime(&m_time)); ! 128: else ! 129: return localtime(&m_time); ! 130: } ! 131: ! 132: #ifdef _DEBUG ! 133: CDumpContext& ! 134: operator <<(CDumpContext& dc, CTime time) ! 135: { ! 136: char* psz = ctime(&time.m_time); ! 137: if (psz == NULL) ! 138: return dc << "CTime(invalid #" << time.m_time << ")"; ! 139: ! 140: // format it ! 141: psz[24] = '\0'; // nuke newline ! 142: return dc << "CTime(\"" << psz << "\")"; ! 143: } ! 144: #endif ! 145: ! 146: CArchive& ! 147: operator <<(CArchive& ar, CTime time) ! 148: { ! 149: return ar << (DWORD) time.m_time; ! 150: } ! 151: ! 152: CArchive& ! 153: operator >>(CArchive& ar, CTime& rtime) ! 154: { ! 155: return ar >> (DWORD&) rtime.m_time; ! 156: } ! 157: ! 158: ! 159: ///////////////////////////////////////////////////////////////////////////// ! 160: // CTimeSpan - relative time ! 161: ! 162: #ifdef _DEBUG ! 163: CDumpContext& ! 164: operator <<(CDumpContext& dc, CTimeSpan timeSpan) ! 165: { ! 166: return dc << "CTimeSpan(" << timeSpan.GetDays() << " days, " << ! 167: timeSpan.GetHours() << " hours, " << ! 168: timeSpan.GetMinutes() << " minutes and " << ! 169: timeSpan.GetSeconds() << " seconds)"; ! 170: } ! 171: #endif ! 172: ! 173: CArchive& ! 174: operator <<(CArchive& ar, CTimeSpan timeSpan) ! 175: { ! 176: return ar << (DWORD) timeSpan.m_timeSpan; ! 177: } ! 178: ! 179: CArchive& ! 180: operator >>(CArchive& ar, CTimeSpan& rtimeSpan) ! 181: { ! 182: return ar >> (DWORD&) rtimeSpan.m_timeSpan; ! 183: } ! 184: ! 185: ! 186: ///////////////////////////////////////////////////////////////////////////// ! 187: // String formatting ! 188: ! 189: #ifndef _WINDLL ! 190: ! 191: #define maxTimeBufferSize 128 ! 192: // Verifies will fail if the needed buffer size is too large ! 193: ! 194: CString ! 195: CTimeSpan::Format(const char* pFormat) ! 196: /* ! 197: -- formatting timespans is a little trickier than formatting CTimes ! 198: -- we are only interested in relative time formats, ie. it is illegal ! 199: to format anything dealing with absolute time (i.e. years, months, ! 200: day of week, day of year, timezones, ...) ! 201: -- only valid formats: ! 202: %D - # of days -- NEW !!! ! 203: %H - hour in 24 hour format ! 204: %M - minute (0-59) ! 205: %S - seconds (0-59) ! 206: %% - percent sign ! 207: */ ! 208: { ! 209: char szBuffer[maxTimeBufferSize]; ! 210: char ch; ! 211: char* pch = szBuffer; ! 212: ! 213: while ((ch = *pFormat++) != '\0') ! 214: { ! 215: ASSERT(pch < &szBuffer[maxTimeBufferSize]); ! 216: if (ch == '%') ! 217: { ! 218: int num; ! 219: switch (ch = *pFormat++) ! 220: { ! 221: default: ! 222: ASSERT(FALSE); // probably a bad format character ! 223: case '%': ! 224: *pch++ = ch; ! 225: break; ! 226: case 'D': ! 227: pch += sprintf(pch, "%ld", GetDays()); ! 228: break; ! 229: case 'H': ! 230: num = GetHours(); ! 231: goto format_num; ! 232: case 'M': ! 233: num = GetMinutes(); ! 234: goto format_num; ! 235: case 'S': ! 236: num = GetSeconds(); ! 237: format_num: ! 238: pch += sprintf(pch, "%02d", num); ! 239: break; ! 240: } ! 241: } ! 242: else ! 243: { ! 244: *pch++ = ch; ! 245: } ! 246: } ! 247: *pch = '\0'; ! 248: ! 249: return szBuffer; ! 250: } ! 251: ! 252: CString ! 253: CTime::Format(const char* pFormat) ! 254: { ! 255: char szBuffer[maxTimeBufferSize]; ! 256: ! 257: VERIFY(strftime(szBuffer, sizeof(szBuffer), pFormat, ! 258: localtime(&m_time))); ! 259: return szBuffer; ! 260: } ! 261: ! 262: CString ! 263: CTime::FormatGmt(const char* pFormat) ! 264: { ! 265: char szBuffer[maxTimeBufferSize]; ! 266: ! 267: VERIFY(strftime(szBuffer, sizeof(szBuffer), pFormat, ! 268: gmtime(&m_time))); ! 269: return szBuffer; ! 270: } ! 271: #endif //_WINDLL ! 272: ! 273: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.