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

网格计算

开发平台:

Visual C++

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