TimeEx.cpp
上传用户:maryhy001
上传日期:2007-05-02
资源大小:2317k
文件大小:17k
源码类别:

网格计算

开发平台:

Visual C++

  1. #include ".TimeEx.h"
  2. #define MIN_DATE (-657434L)  // about year 100
  3. #define MAX_DATE 2958465L    // about year 9999
  4. // Half a second, expressed in days
  5. #define HALF_SECOND (1.0/172800.0)
  6. // One-based array of days in year at month start
  7. static int rgMonthDays[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
  8. //get current date
  9. void CDateEx::NowDate()
  10. {
  11. SYSTEMTIME systime;
  12. memset(&systime, 0x0, sizeof(systime));
  13. GetLocalTime(&systime);
  14. this->m_unYear = systime.wYear;
  15. this->m_unMonth = systime.wMonth;
  16. this->m_unDay = systime.wDay;
  17. }
  18. //get the date string text
  19. void CDateEx::AsDString(LPSTR lpzDate, bool bFixedFmt)
  20. {
  21. if(NULL == lpzDate){
  22. throw "param is null, invalid memory!!!";
  23. }
  24. memset(lpzDate, 0x0, MAX_DATE_SIZE);
  25. if(bFixedFmt){
  26. sprintf(lpzDate, "%04d-%02d-%02d", m_unYear, m_unMonth, m_unDay);
  27. }
  28. else{
  29. sprintf(lpzDate, "%d-%d-%d", m_unYear, m_unMonth, m_unDay);
  30. }
  31. return ;
  32. }
  33. //operator "="
  34. CDateEx CDateEx::operator=(CDateEx &dtDate)
  35. {
  36. this->m_unYear = dtDate.Year();
  37. this->m_unMonth = dtDate.Month();
  38. this->m_unDay = dtDate.Day();
  39. return (*this);
  40. }
  41. //operator "=="
  42. bool CDateEx::operator==(CDateEx &dtDate)
  43. {
  44. return (this->m_unYear == dtDate.Year() &&
  45. this->m_unMonth == dtDate.Month() &&
  46. this->m_unDay == dtDate.Day());
  47. }
  48. //operator "!="
  49. bool CDateEx::operator!=(CDateEx &dtDate)
  50. {
  51. return !(*this==dtDate);
  52. }
  53. //operator ">"
  54. bool CDateEx::operator>(CDateEx &dtDate)
  55. {
  56. if( this->m_unYear >= dtDate.Year() &&
  57. this->m_unMonth >= dtDate.Month() &&
  58. this->m_unDay > dtDate.Day())
  59. return true;
  60. else
  61. return false;
  62. }
  63. //operator ">="
  64. bool CDateEx::operator>=(CDateEx &dtDate)
  65. {
  66. if(*this>dtDate || *this==dtDate){
  67. return true;
  68. }
  69. else{
  70. return false;
  71. }
  72. }
  73. //operator "<"
  74. bool CDateEx::operator<(CDateEx &dtDate)
  75. {
  76. return !(*this >= dtDate);
  77. }
  78. //operator "<="
  79. bool CDateEx::operator<=(CDateEx &dtDate)
  80. {
  81. return (*this < dtDate || *this == dtDate);
  82. }
  83. //operator "-"
  84. int CDateEx::operator-(CDateEx &dtDate)
  85. {
  86. if(*this==dtDate){
  87. return 0;
  88. }
  89. //get the begin and end date
  90. CDateEx dtBegin, dtEnd;
  91. if(*this > dtDate){
  92. dtBegin = dtDate;
  93. dtEnd = *this;
  94. }
  95. else{
  96. dtBegin = *this;
  97. dtEnd = dtDate;
  98. }
  99. //get the days
  100. int nret = ( dtEnd.Year() - dtBegin.Year() ) * 365;
  101. for(int i = dtBegin.Month(); i < dtEnd.Month(); ++i){
  102. switch(i) {
  103. case 1: case 3: case 5: case 7:
  104. case 8: case 10: case 12:
  105. nret += 31;
  106. break;
  107. case 2:
  108. nret += this->IsLeapYear()?29:28;
  109. break;
  110. default:
  111. nret += 30;
  112. break;
  113. }
  114. }
  115. nret += (dtEnd.Day() - dtBegin.Day());
  116. return nret;
  117. }
  118. //operator "++"
  119. CDateEx CDateEx::operator++(int)
  120. {
  121. bool bnextMonth = false;
  122. if( IsLeapYear() ){
  123. if(m_unMonth == 2 && 29 == m_unDay){
  124. bnextMonth = true;
  125. }
  126. }
  127. else{
  128. if(m_unMonth == 2 && 28 == m_unDay){
  129. bnextMonth = true;
  130. }
  131. }
  132. if(bnextMonth){
  133. goto NextMonth;
  134. }
  135. else{
  136. if( (IsLargeMonth(m_unMonth) && 31 == m_unDay) ||
  137. (!IsLargeMonth(m_unMonth) && 30 == m_unDay) ){
  138. bnextMonth = true;
  139. }
  140. }
  141. if(bnextMonth){
  142. goto NextMonth;
  143. }
  144. else{
  145. ++m_unDay;
  146. goto Over;
  147. }
  148. NextMonth:
  149. {
  150. //is end of the year
  151. if(12 == m_unMonth){
  152. m_unMonth = 1;
  153. ++m_unYear;
  154. }
  155. else{
  156. ++m_unMonth;
  157. }
  158. m_unDay = 1;
  159. }
  160. Over:
  161. return (*this);
  162. }
  163. //operator "--"
  164. CDateEx CDateEx::operator--(int)
  165. {
  166. bool bpriorMonth = false;
  167. if( IsLeapYear() ){
  168. if(m_unMonth == 3 && 1 == m_unDay){
  169. m_unDay = 29;
  170. bpriorMonth = true;
  171. }
  172. }
  173. else{
  174. if(m_unMonth == 3 && 1 == m_unDay){
  175. m_unDay = 28;
  176. bpriorMonth = true;
  177. }
  178. }
  179. if(bpriorMonth){
  180. goto PriorMonth;
  181. }
  182. else{
  183. if(IsLargeMonth(m_unMonth) && 1 == m_unDay){
  184. m_unDay = 31;
  185. bpriorMonth = true;
  186. }else if(!IsLargeMonth(m_unMonth) && 1 == m_unDay){
  187. m_unDay = 30;
  188. bpriorMonth = true;
  189. }
  190. }
  191. if(bpriorMonth){
  192. goto PriorMonth;
  193. }
  194. else{
  195. --m_unDay;
  196. goto Over;
  197. }
  198. PriorMonth:
  199. {
  200. //is end of the year
  201. if(1 == m_unMonth){
  202. m_unMonth = 12;
  203. --m_unYear;
  204. }
  205. else{
  206. --m_unMonth;
  207. }
  208. }
  209. Over:
  210. return (*this);
  211. }
  212. //#########################################################################
  213. //get current date
  214. void CTimeEx::NowTime()
  215. {
  216. SYSTEMTIME systime;
  217. memset(&systime, 0x0, sizeof(systime));
  218. GetLocalTime(&systime);
  219. this->m_unHour = systime.wHour;
  220. this->m_unMinu = systime.wMinute;
  221. this->m_unSecn = systime.wSecond;
  222. }
  223. //get the time string text
  224. void CTimeEx::AsTString(LPSTR lpzTime, bool bFixedFmt)
  225. {
  226. if(NULL == lpzTime){
  227. throw "param is null, invalid memory!!!";
  228. }
  229. memset(lpzTime, 0x0, MAX_TIME_SIZE);
  230. if(bFixedFmt){
  231. sprintf(lpzTime, "%04d-%02d-%02d", m_unHour, m_unMinu, m_unSecn);
  232. }
  233. else{
  234. sprintf(lpzTime, "%d-%d-%d", m_unHour, m_unMinu, m_unSecn);
  235. }
  236. return ;
  237. }
  238. //operator "="
  239. CTimeEx CTimeEx::operator=(CTimeEx &dtTime)
  240. {
  241. this->m_unHour = dtTime.Hour();
  242. this->m_unMinu = dtTime.Minute();
  243. this->m_unSecn = dtTime.Second();
  244. return (*this);
  245. }
  246. //operator "=="
  247. bool CTimeEx::operator==(CTimeEx &dtTime)
  248. {
  249. if( this->m_unHour == dtTime.Hour() &&
  250. this->m_unMinu == dtTime.Minute() &&
  251. this->m_unSecn == dtTime.Second())
  252. return true;
  253. else
  254. return false;
  255. }
  256. //operator "!="
  257. bool CTimeEx::operator!=(CTimeEx &dtTime)
  258. {
  259. return !(*this==dtTime);
  260. }
  261. //operator ">"
  262. bool CTimeEx::operator>(CTimeEx &dtTime)
  263. {
  264. if( this->m_unHour >= dtTime.Hour() &&
  265. this->m_unMinu >= dtTime.Minute() &&
  266. this->m_unSecn > dtTime.Second())
  267. return true;
  268. else
  269. return false;
  270. }
  271. //operator ">="
  272. bool CTimeEx::operator>=(CTimeEx &dtTime)
  273. {
  274. return (*this == dtTime || *this > dtTime);
  275. }
  276. //operator "<"
  277. bool CTimeEx::operator<(CTimeEx &dtTime)
  278. {
  279. return !(*this >= dtTime);
  280. }
  281. //operator "<="
  282. bool CTimeEx::operator<=(CTimeEx &dtTime)
  283. {
  284. return (*this == dtTime || *this < dtTime);
  285. }
  286. //operator "-"
  287. DWORD CTimeEx::operator-(CTimeEx &dtTime)
  288. {
  289. CTimeEx dtBegin,
  290. dtEnd;
  291. if(*this >= dtTime){
  292. dtBegin = dtTime;
  293. dtEnd = *this;
  294. }
  295. else{
  296. dtBegin = *this;
  297. dtEnd = dtTime;
  298. }
  299. //calc the seconds value
  300. DWORD dwret = (dtEnd.Hour() - dtBegin.Hour()) * 3600 ;
  301. dwret += (dtEnd.Minute() - dtBegin.Minute()) * 60;
  302. dwret += (dtEnd.Second() - dtBegin.Second());
  303. return dwret;
  304. }
  305. //operator "++"(add one second)
  306. CTimeEx CTimeEx::operator++(int)
  307. {
  308. if(59 == m_unSecn){
  309. m_unSecn = 0;
  310. if(59 == m_unMinu){
  311. m_unMinu = 0;
  312. if(23 == m_unHour){
  313. m_unHour = 0;
  314. }
  315. else{
  316. ++m_unHour;
  317. }
  318. }
  319. else{
  320. ++m_unMinu;
  321. }
  322. }
  323. else{
  324. ++m_unSecn;
  325. }
  326. return (*this);
  327. }
  328. //operator "--"(sub one second)
  329. CTimeEx CTimeEx::operator--(int)
  330. {
  331. if(0 == m_unSecn){
  332. m_unSecn = 59;
  333. if(0 == m_unMinu){
  334. m_unMinu = 59;
  335. if(0 == m_unHour){
  336. m_unHour = 23;
  337. }
  338. else{
  339. --m_unHour;
  340. }
  341. }
  342. else{
  343. --m_unMinu;
  344. }
  345. }
  346. else{
  347. --m_unSecn;
  348. }
  349. return (*this);
  350. }
  351. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  352. //constructor and destructor
  353. CDateTimeEx::CDateTimeEx()
  354. {
  355. this->Now();
  356. }
  357. //updown inherited static cast change
  358. CDateTimeEx::CDateTimeEx(CDateEx &dtDate)
  359. {
  360. this->m_unYear = dtDate.Year();
  361. this->m_unMonth = dtDate.Month();
  362. this->m_unDay = dtDate.Day();
  363. }
  364. CDateTimeEx::CDateTimeEx(CTimeEx &dtTime)
  365. {
  366. this->m_unHour = dtTime.Hour();
  367. this->m_unMinu = dtTime.Minute();
  368. this->m_unSecn = dtTime.Second();
  369. }
  370. //SYSTEMTIME change to CDateTimeEx
  371. CDateTimeEx::CDateTimeEx(const SYSTEMTIME stTime)
  372. {
  373. equalSysTime(stTime);
  374. }
  375. //FILETIME change to CDateTimeEx
  376. CDateTimeEx::CDateTimeEx(const FILETIME ftTime)
  377. {
  378. try{
  379. equalFileTime(ftTime);
  380. }
  381. catch(std::exception e){
  382. throw e.what();
  383. }
  384. }
  385. //DATE change to CDateTimeEx
  386. CDateTimeEx::CDateTimeEx(const DATE dtSrc)
  387. {
  388. struct tm tmDest;
  389. memset(&tmDest, 0x0, sizeof(tmDest));
  390. if( this->DTFromOleDate(dtSrc, tmDest) ){
  391. this->m_unYear = tmDest.tm_year;
  392. this->m_unMonth = tmDest.tm_mon + 1;
  393. this->m_unDay = tmDest.tm_mday;
  394. this->m_unHour = tmDest.tm_hour;
  395. this->m_unMinu = tmDest.tm_min;
  396. this->m_unSecn = tmDest.tm_sec;
  397. }
  398. }
  399. //"struct tm" change to CDateTimeEx
  400. CDateTimeEx::CDateTimeEx(struct tm &tmDest)
  401. {
  402. this->m_unYear = tmDest.tm_year;
  403. this->m_unMonth = tmDest.tm_mon + 1;
  404. this->m_unDay = tmDest.tm_mday;
  405. this->m_unHour = tmDest.tm_hour;
  406. this->m_unMinu = tmDest.tm_min;
  407. this->m_unSecn = tmDest.tm_sec;
  408. }
  409. //operator "=" --- system time
  410. CDateTimeEx& CDateTimeEx::operator=(const SYSTEMTIME stTime)
  411. {
  412. equalSysTime(stTime);
  413. return (*this);
  414. };
  415. //operator "=" --- file time
  416. CDateTimeEx& CDateTimeEx::operator=(const FILETIME ftTime)
  417. {
  418. try{
  419. equalFileTime(ftTime);
  420. }
  421. catch(std::exception e){
  422. throw e.what();
  423. }
  424. return (*this);
  425. }
  426. //get the now datetime info
  427. void CDateTimeEx::Now()
  428. {
  429. static_cast<CDateEx *>(this)->NowDate();
  430. static_cast<CTimeEx *>(this)->NowTime();
  431. }
  432. //get the datetime string text
  433. void CDateTimeEx::AsDTString(LPSTR lpzDateTime, bool bFixedFmt)
  434. {
  435. if(NULL == lpzDateTime){
  436. throw "param is null, invalid memory!!!";
  437. }
  438. memset(lpzDateTime, 0x0, MAX_DATE_SIZE + MAX_TIME_SIZE);
  439. if(bFixedFmt){
  440. sprintf(lpzDateTime, "%04d-%02d-%02d %02d:%02d:%02d", 
  441. m_unYear, m_unMonth, m_unDay,
  442. m_unHour, m_unMinu, m_unSecn);
  443. }
  444. else{
  445. sprintf(lpzDateTime, "%d-%d-%d %d:%d:%d", 
  446. m_unYear, m_unMonth, m_unDay,
  447. m_unHour, m_unMinu, m_unSecn);
  448. }
  449. return ;
  450. }
  451. void CDateTimeEx::equalSysTime(const SYSTEMTIME stTime)
  452. {
  453. this->m_unYear = stTime.wYear;
  454. this->m_unMonth = stTime.wMonth;
  455. this->m_unDay = stTime.wDay;
  456. this->m_unHour = stTime.wHour;
  457. this->m_unMinu = stTime.wMinute;
  458. this->m_unSecn = stTime.wSecond;
  459. }
  460. void CDateTimeEx::equalFileTime(const FILETIME ftTime)
  461. {
  462. FILETIME lftTime;
  463. if( 0 == FileTimeToLocalFileTime(&ftTime, &lftTime) ){
  464. throw "FileTimeToLocalFileTime function is failed...";
  465. }
  466. //////////////////////////////////////////////////////////
  467. WORD wDate, wTime;
  468. if( 0 == FileTimeToDosDateTime(&lftTime, &wDate, &wTime) ){
  469. throw "FileTimeToDosDateTime function is failed...";
  470. }
  471. SYSTEMTIME stTime;
  472. memset(&stTime, 0x0, sizeof(stTime));
  473. //get the date and time value
  474. stTime.wDay = (wDate & 0x001F);
  475. stTime.wMonth = (wDate & 0x01E0) >> 5;
  476. stTime.wYear = ( (wDate & 0xFE00) >>9 ) + 1980;
  477. stTime.wSecond = (wTime & 0x001E) * 2;
  478. stTime.wMinute = (wTime >> 5) & 0x003F;
  479. stTime.wHour = (wTime >> 11) & 0x001F;
  480. equalSysTime(stTime);
  481. }
  482. //get "struct tm" from DATE structor
  483. bool CDateTimeEx::DTFromOleDate(DATE dtSrc, struct tm& tmDest)
  484. {
  485. // The legal range does not actually span year 0 to 9999.
  486.     if (dtSrc > MAX_DATE || dtSrc < MIN_DATE) // about year 100 to about 9999
  487.         return false;
  488.     
  489.     long nDays; // Number of days since Dec. 30, 1899
  490.     long nDaysAbsolute; // Number of days since 1/1/0
  491.     long nSecsInDay;    // Time in seconds since midnight
  492.     long nMinutesInDay; // Minutes in day
  493.     
  494.     long n400Years;     // Number of 400 year increments since 1/1/0
  495.     long n400Century;   // Century within 400 year block (0,1,2 or 3)
  496.     long n4Years; // Number of 4 year increments since 1/1/0
  497.     long n4Day; // Day within 4 year block
  498.     // (0 is 1/1/yr1, 1460 is 12/31/yr4)
  499.     long n4Yr; // Year within 4 year block (0,1,2 or 3)
  500.     BOOL bLeap4 = TRUE; // TRUE if 4 year block includes leap year
  501.     
  502.     double dblDate = dtSrc; // tempory serial date
  503.     
  504.     // If a valid date, then this conversion should not overflow
  505.     nDays = (long)dblDate;
  506.     
  507.     // Round to the second
  508.     dblDate += ((dtSrc > 0.0) ? HALF_SECOND : -HALF_SECOND);
  509.     
  510.     nDaysAbsolute = (long)dblDate + 693959L; // Add days from 1/1/0 to 12/30/1899
  511.         
  512. dblDate = fabs(dblDate);
  513.     nSecsInDay = (long)((dblDate - floor(dblDate)) * 86400.0);
  514.     
  515.     // Calculate the day of week (sun=1, mon=2...)
  516.     //  -1 because 1/1/0 is Sat. +1 because we want 1-based
  517.     tmDest.tm_wday = (int)((nDaysAbsolute - 1) % 7L) + 1;
  518.     
  519.     // Leap years every 4 yrs except centuries not multiples of 400.
  520.     n400Years = (long)(nDaysAbsolute / 146097L);
  521.     
  522.     // Set nDaysAbsolute to day within 400-year block
  523.     nDaysAbsolute %= 146097L;
  524.     
  525.     // -1 because first century has extra day
  526.     n400Century = (long)((nDaysAbsolute - 1) / 36524L);
  527.     
  528.     // Non-leap century
  529.     if (n400Century != 0)
  530.     {
  531.          // Set nDaysAbsolute to day within century
  532.          nDaysAbsolute = (nDaysAbsolute - 1) % 36524L;
  533.         
  534.          // +1 because 1st 4 year increment has 1460 days
  535.          n4Years = (long)((nDaysAbsolute + 1) / 1461L);
  536.         
  537.          if (n4Years != 0)
  538.               n4Day = (long)((nDaysAbsolute + 1) % 1461L);
  539.          else
  540.          {
  541.               bLeap4 = FALSE;
  542.               n4Day = (long)nDaysAbsolute;
  543.          }
  544.     }
  545.     else
  546.     {
  547.          // Leap century - not special case!
  548.          n4Years = (long)(nDaysAbsolute / 1461L);
  549.          n4Day = (long)(nDaysAbsolute % 1461L);
  550.     }
  551.     
  552.     if (bLeap4)
  553.     {
  554.          // -1 because first year has 366 days
  555.          n4Yr = (n4Day - 1) / 365;
  556.         
  557.          if (n4Yr != 0)
  558.               n4Day = (n4Day - 1) % 365;
  559.     }
  560.     else
  561.     {
  562.          n4Yr = n4Day / 365;
  563.          n4Day %= 365;
  564.     }
  565.     
  566.     // n4Day is now 0-based day of year. Save 1-based day of year, year number
  567. tmDest.tm_yday = (int)n4Day + 1;
  568.     tmDest.tm_year = n400Years * 400 + n400Century * 100 + n4Years * 4 + n4Yr;
  569.     
  570.     // Handle leap year: before, on, and after Feb. 29.
  571.     if (n4Yr == 0 && bLeap4)
  572.     {
  573.          // Leap Year
  574.          if (n4Day == 59)
  575.          {
  576.               /* Feb. 29 */
  577.               tmDest.tm_mon = 2;
  578.               tmDest.tm_mday = 29;
  579.             
  580.               goto DoTime;
  581.          }
  582.         
  583.          // Pretend it's not a leap year for month/day comp.
  584.          if (n4Day >= 60)
  585.               --n4Day;
  586.     }
  587.     
  588.     // Make n4DaY a 1-based day of non-leap year and compute
  589.     // month/day for everything but Feb. 29.
  590.     ++n4Day;
  591.     
  592.     // Month number always >= n/32, so save some loop time */
  593.     for (tmDest.tm_mon = (n4Day >> 5) + 1;
  594. n4Day > rgMonthDays[tmDest.tm_mon]; tmDest.tm_mon++);
  595.     
  596.     tmDest.tm_mday = (int)(n4Day - rgMonthDays[tmDest.tm_mon-1]);
  597.     
  598. DoTime:
  599.     if (nSecsInDay == 0)
  600.          tmDest.tm_hour = tmDest.tm_min = tmDest.tm_sec = 0;
  601.     else
  602.     {
  603.          tmDest.tm_sec = (int)nSecsInDay % 60L;
  604.          nMinutesInDay = nSecsInDay / 60L;
  605.          tmDest.tm_min = (int)nMinutesInDay % 60;
  606.          tmDest.tm_hour = (int)nMinutesInDay / 60;
  607.     }
  608.     
  609.     return true;
  610. }
  611. //######################################################################
  612. bool CDateTimeEx::OleDateFromDT(WORD wYear, WORD wMonth, WORD wDay,
  613.    WORD wHour, WORD wMinute, WORD wSecond, DATE& dtDest)
  614. {
  615. // Validate year and month (ignore day of week and milliseconds)
  616.     if (wYear > 9999 || wMonth < 1 || wMonth > 12)
  617. return false;
  618.     
  619.     //  Check for leap year and set the number of days in the month
  620.     BOOL bLeapYear = ((wYear & 3) == 0) &&
  621. ((wYear % 100) != 0 || (wYear % 400) == 0);
  622.     
  623.     int nDaysInMonth =
  624. rgMonthDays[wMonth] - rgMonthDays[wMonth-1] +
  625. ((bLeapYear && wDay == 29 && wMonth == 2) ? 1 : 0);
  626.     
  627.     // Finish validating the date
  628.     if (wDay < 1 || wDay > nDaysInMonth ||
  629. wHour > 23 || wMinute > 59 ||
  630. wSecond > 59)
  631.     {
  632. return false;
  633.     }
  634.     
  635.     // Cache the date in days and time in fractional days
  636.     long nDate;
  637.     double dblTime;
  638.     
  639.     //It is a valid date; make Jan 1, 1AD be 1
  640.     nDate = wYear*365L + wYear/4 - wYear/100 + wYear/400 +
  641.         
  642. rgMonthDays[wMonth-1] + wDay;
  643.     
  644.     //  If leap year and it's before March, subtract 1:
  645.     if (wMonth <= 2 && bLeapYear)
  646. --nDate;
  647.     
  648.     //  Offset so that 12/30/1899 is 0
  649.     nDate -= 693959L;
  650.     
  651.     dblTime = (((long)wHour * 3600L) +  // hrs in seconds
  652. ((long)wMinute * 60L) +  // mins in seconds
  653. ((long)wSecond)) / 86400.;
  654.     
  655.     dtDest = (double) nDate + ((nDate >= 0) ? dblTime : -dblTime);
  656.     
  657.     return true;
  658. }
  659. //get OleDate
  660. bool CDateTimeEx::getOleDate(struct tm *tmTime)
  661. {
  662. if(NULL==tmTime){
  663. return false;
  664. }
  665. //start conversion
  666. DATE dtDest;
  667. memset(&dtDest, 0x0, sizeof(dtDest));
  668. if( !this->OleDateFromDT(this->Year(), this->Month(), this->Day(),
  669. this->Hour(), this->Minute(), this->Second(), dtDest) ){
  670. return false;
  671. }
  672. memset(tmTime, 0x0, sizeof(struct tm));
  673. if( !this->DTFromOleDate(dtDest, *tmTime) ){
  674. return false;
  675. }
  676. return true;
  677. };
  678. //day of week
  679. WEEKDAY CDateTimeEx::DayOfWeek()
  680. {
  681. struct tm tmTime;
  682. if( !this->getOleDate(&tmTime) ){
  683. return WD_ERROR;
  684. }
  685. else{
  686. switch(tmTime.tm_wday-1) {
  687. case 0:
  688. return WD_SUNDAY;
  689. break;
  690. case 1:
  691. return WD_MONDAY;
  692. break;
  693. case 2:
  694. return WD_TUESDAY;
  695. break;
  696. case 3:
  697. return WD_WEDNESDAY;
  698. break;
  699. case 4:
  700. return WD_THURSDAY;
  701. break;
  702. case 5:
  703. return WD_FRIDAY;
  704. break;
  705. case 6:
  706. return WD_SATURDAY;
  707. break;
  708. default:
  709. return WD_ERROR;
  710. break;
  711. }
  712. }
  713. }