DDateTime.hpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. /***************************************************************************
  2. * E-Com Technology Ltd.
  3. *
  4. * ECOMPACS DICOM Network Transport Libraries * Version 0.1 Beta
  5. ***************************************************************************/
  6. #ifndef _DICOM_DATETIME_
  7. #define _DICOM_DATETIME_
  8. typedef double DATE;
  9. class DDateTimeSpan;
  10. /////////////////////////////////////////////////////////////////////////////
  11. // DDateTime class helpers
  12. #define DDATETIME_ERROR (-1)
  13. #define DDATETIME_HALFSECOND (1.0 / (2.0 * (60.0 * 60.0 * 24.0)))
  14. /////////////////////////////////////////////////////////////////////////////
  15. // DDateTime class
  16. class DICOM_API DDateTime
  17. {
  18. // Constructors
  19. public:
  20. static DDateTime PASCAL GetCurrentTime ();
  21. DDateTime ();
  22. DDateTime (const DDateTime & dateSrc);
  23. DDateTime (DATE dtSrc);
  24. DDateTime (time_t timeSrc);
  25. DDateTime (int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec);
  26. DDateTime (const char * DateString, const char * TimeStr);
  27. DDateTime (WORD wDosDate, WORD wDosTime, int nDST);
  28. // Attributes
  29. public:
  30. enum DateTimeStatus
  31. {
  32. valid = 0,
  33. invalid = 1, // Invalid date (out of range, etc.)
  34. null = 2, // Literally has no value
  35. };
  36. DATE m_dt;
  37. DateTimeStatus m_status;
  38. void SetStatus (DateTimeStatus status);
  39. DateTimeStatus GetStatus () const;
  40. int GetYear () const;
  41. int GetMonth () const; // month of year (1 = Jan)
  42. int GetDay () const; // day of month (0-31)
  43. int GetHour () const; // hour in day (0-23)
  44. int GetMinute () const; // minute in hour (0-59)
  45. int GetSecond () const; // second in minute (0-59)
  46. int GetDayOfWeek () const; // 1=Sun, 2=Mon, ..., 7=Sat
  47. int GetDayOfYear () const; // days since start of year, Jan 1 = 1
  48. bool IsSunday () const { return (GetDayOfWeek () == 1); }
  49. bool IsMonday () const { return (GetDayOfWeek () == 2); }
  50. bool IsTuesday () const { return (GetDayOfWeek () == 3); }
  51. bool IsWednesday () const { return (GetDayOfWeek () == 4); }
  52. bool IsThursday () const { return (GetDayOfWeek () == 5); }
  53. bool IsFriday () const { return (GetDayOfWeek () == 6); }
  54. bool IsSaturday () const { return (GetDayOfWeek () == 7); }
  55. // Operations
  56. public:
  57. const DDateTime & operator = (const DDateTime & dateSrc);
  58. const DDateTime & operator = (DATE dtSrc);
  59. const DDateTime & operator = (const time_t & timeSrc);
  60. BOOL operator == (const DDateTime & date) const;
  61. BOOL operator != (const DDateTime & date) const;
  62. BOOL operator < (const DDateTime & date) const;
  63. BOOL operator > (const DDateTime & date) const;
  64. BOOL operator <= (const DDateTime & date) const;
  65. BOOL operator >= (const DDateTime & date) const;
  66. // DateTime math
  67. DDateTime operator + (const DDateTimeSpan & dateSpan) const;
  68. DDateTime operator - (const DDateTimeSpan & dateSpan) const;
  69. const DDateTime & operator += (const DDateTimeSpan dateSpan);
  70. const DDateTime & operator -= (const DDateTimeSpan dateSpan);
  71. // DateTimeSpan math
  72. DDateTimeSpan operator - (const DDateTime & date) const;
  73. operator DATE () const;
  74. int SetDateTime (int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec);
  75. int SetDate (int nYear, int nMonth, int nDay);
  76. int SetTime (int nHour, int nMin, int nSec);
  77. int SetDateTime (const char * DateStr, const char * TimeStr);
  78. // 保留时间不变,但是日期用DateStr中的日期
  79. int SetDate (const char * DateStr);
  80. // 保留日期不变,但是时间设置为TimeStr中的日期
  81. int SetTime (const char * TimeStr);
  82. // formatting
  83. DString Format (LPCTSTR lpszFormat) const;
  84. DString ToString (LPCTSTR lpszFormat) const
  85. {
  86. return Format (lpszFormat);
  87. }
  88. DString FormatDate (void) const;
  89. DString FormatTime (void) const;
  90. // Implementation
  91. protected:
  92. void CheckRange ();
  93. friend class DDateTimeSpan;
  94. };
  95. /////////////////////////////////////////////////////////////////////////////
  96. // DDateTimeSpan class
  97. class DICOM_API DDateTimeSpan
  98. {
  99. // Constructors
  100. public:
  101. DDateTimeSpan ();
  102. DDateTimeSpan (double dblSpanSrc);
  103. DDateTimeSpan (const DDateTimeSpan & dateSpanSrc);
  104. DDateTimeSpan (long lDays, int nHours, int nMins, int nSecs);
  105. DDateTimeSpan (const char * SpanString);
  106. // Attributes
  107. public:
  108. enum DateTimeSpanStatus
  109. {
  110. valid = 0,
  111. invalid = 1, // Invalid span (out of range, etc.)
  112. null = 2, // Literally has no value
  113. };
  114. double m_span;
  115. DateTimeSpanStatus m_status;
  116. void SetStatus (DateTimeSpanStatus status);
  117. DateTimeSpanStatus GetStatus () const;
  118. double GetTotalDays () const; // span in days (about -3.65e6 to 3.65e6)
  119. double GetTotalHours () const; // span in hours (about -8.77e7 to 8.77e6)
  120. double GetTotalMinutes () const; // span in minutes (about -5.26e9 to 5.26e9)
  121. double GetTotalSeconds () const; // span in seconds (about -3.16e11 to 3.16e11)
  122. long GetDays () const; // component days in span
  123. long GetHours () const; // component hours in span (-23 to 23)
  124. long GetMinutes () const; // component minutes in span (-59 to 59)
  125. long GetSeconds () const; // component seconds in span (-59 to 59)
  126. // Operations
  127. public:
  128. const DDateTimeSpan & operator = (double dblSpanSrc);
  129. const DDateTimeSpan & operator = (const DDateTimeSpan & dateSpanSrc);
  130. BOOL operator == (const DDateTimeSpan & dateSpan) const;
  131. BOOL operator != (const DDateTimeSpan & dateSpan) const;
  132. BOOL operator < (const DDateTimeSpan & dateSpan) const;
  133. BOOL operator > (const DDateTimeSpan & dateSpan) const;
  134. BOOL operator <= (const DDateTimeSpan & dateSpan) const;
  135. BOOL operator >= (const DDateTimeSpan & dateSpan) const;
  136. // DateTimeSpan math
  137. DDateTimeSpan operator + (const DDateTimeSpan & dateSpan) const;
  138. DDateTimeSpan operator - (const DDateTimeSpan & dateSpan) const;
  139. const DDateTimeSpan & operator += (const DDateTimeSpan dateSpan);
  140. const DDateTimeSpan & operator -= (const DDateTimeSpan dateSpan);
  141. DDateTimeSpan operator - () const;
  142. operator double () const;
  143. void SetDateTimeSpan (long lDays, int nHours, int nMins, int nSecs);
  144. // formatting
  145. DString Format (LPCTSTR lpszFormat) const;
  146. DString ToString (LPCTSTR lpszFormat) const
  147. {
  148. return Format (lpszFormat);
  149. }
  150. // Implementation
  151. public:
  152. void CheckRange ();
  153. friend class DDateTime;
  154. };
  155. // DDateTime
  156. __inline DDateTime::DDateTime ()
  157. { m_dt = 0; SetStatus (valid); }
  158. __inline DDateTime::DDateTime (const DDateTime & dateSrc)
  159. { m_dt = dateSrc.m_dt; m_status = dateSrc.m_status; }
  160. __inline DDateTime::DDateTime (DATE dtSrc)
  161. { m_dt = dtSrc; SetStatus (valid); }
  162. __inline DDateTime::DDateTime (time_t timeSrc)
  163. { *this = timeSrc; }
  164. __inline DDateTime::DDateTime (int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec)
  165. { SetDateTime (nYear, nMonth, nDay, nHour, nMin, nSec); }
  166. __inline const DDateTime& DDateTime::operator = (const DDateTime& dateSrc)
  167. { m_dt = dateSrc.m_dt; m_status = dateSrc.m_status; return *this; }
  168. __inline DDateTime::DateTimeStatus DDateTime::GetStatus () const
  169. { return m_status; }
  170. __inline void DDateTime::SetStatus (DateTimeStatus status)
  171. { m_status = status; }
  172. __inline BOOL DDateTime::operator == (const DDateTime& date) const
  173. { return (m_status == date.m_status && m_dt == date.m_dt); }
  174. __inline BOOL DDateTime::operator != (const DDateTime& date) const
  175. { return (m_status != date.m_status || m_dt != date.m_dt); }
  176. __inline const DDateTime & DDateTime::operator += (const DDateTimeSpan dateSpan)
  177. { *this = *this + dateSpan; return *this; }
  178. __inline const DDateTime & DDateTime::operator -= (const DDateTimeSpan dateSpan)
  179. { *this = *this - dateSpan; return *this; }
  180. __inline DDateTime::operator DATE () const
  181. { return m_dt; }
  182. __inline int DDateTime::SetDate (int nYear, int nMonth, int nDay)
  183. { return SetDateTime (nYear, nMonth, nDay, 0, 0, 0); }
  184. __inline int DDateTime::SetTime (int nHour, int nMin, int nSec)
  185. // Set date to zero date - 12/30/1899
  186. { return SetDateTime (1899, 12, 30, nHour, nMin, nSec); }
  187. // DDateTimeSpan
  188. __inline DDateTimeSpan::DDateTimeSpan ()
  189. { m_span = 0; SetStatus (valid); }
  190. __inline DDateTimeSpan::DDateTimeSpan (double dblSpanSrc)
  191. { m_span = dblSpanSrc; SetStatus (valid); }
  192. __inline DDateTimeSpan::DDateTimeSpan (const DDateTimeSpan& dateSpanSrc)
  193. { m_span = dateSpanSrc.m_span; m_status = dateSpanSrc.m_status; }
  194. __inline DDateTimeSpan::DDateTimeSpan (long lDays, int nHours, int nMins, int nSecs)
  195. { SetDateTimeSpan (lDays, nHours, nMins, nSecs); }
  196. __inline DDateTimeSpan::DateTimeSpanStatus DDateTimeSpan::GetStatus () const
  197. { return m_status; }
  198. __inline void DDateTimeSpan::SetStatus (DateTimeSpanStatus status)
  199. { m_status = status; }
  200. __inline double DDateTimeSpan::GetTotalDays () const
  201. {
  202. // ASSERT (GetStatus () == valid);
  203. return m_span;
  204. }
  205. __inline double DDateTimeSpan::GetTotalHours () const
  206. {
  207. // ASSERT (GetStatus () == valid);
  208. long lReturns = (long) (m_span * 24 + DDATETIME_HALFSECOND);
  209. return lReturns;
  210. }
  211. __inline double DDateTimeSpan::GetTotalMinutes () const
  212. {
  213. // ASSERT (GetStatus () == valid);
  214. long lReturns = (long) (m_span * 24 * 60 + DDATETIME_HALFSECOND);
  215. return lReturns;
  216. }
  217. __inline double DDateTimeSpan::GetTotalSeconds () const
  218. {
  219. // ASSERT (GetStatus () == valid);
  220. long lReturns = (long) (m_span * 24 * 60 * 60 + DDATETIME_HALFSECOND);
  221. return lReturns;
  222. }
  223. __inline long DDateTimeSpan::GetDays () const
  224. {
  225. // ASSERT (GetStatus () == valid);
  226. return (long)m_span;
  227. }
  228. __inline BOOL DDateTimeSpan::operator == (const DDateTimeSpan& dateSpan) const
  229. { return (m_status == dateSpan.m_status && m_span == dateSpan.m_span); }
  230. __inline BOOL DDateTimeSpan::operator != (const DDateTimeSpan& dateSpan) const
  231. { return (m_status != dateSpan.m_status || m_span != dateSpan.m_span); }
  232. __inline BOOL DDateTimeSpan::operator < (const DDateTimeSpan& dateSpan) const
  233. {
  234. // ASSERT (GetStatus () == valid);
  235. // ASSERT (dateSpan.GetStatus () == valid);
  236. return m_span < dateSpan.m_span;
  237. }
  238. __inline BOOL DDateTimeSpan::operator > (const DDateTimeSpan& dateSpan) const
  239. {
  240. // ASSERT (GetStatus () == valid);
  241. // ASSERT (dateSpan.GetStatus () == valid);
  242. return m_span > dateSpan.m_span;
  243. }
  244. __inline BOOL DDateTimeSpan::operator <= (const DDateTimeSpan& dateSpan) const
  245. {
  246. // ASSERT (GetStatus () == valid);
  247. // ASSERT (dateSpan.GetStatus () == valid);
  248. return m_span <= dateSpan.m_span;
  249. }
  250. __inline BOOL DDateTimeSpan::operator >= (const DDateTimeSpan& dateSpan) const
  251. {
  252. // ASSERT (GetStatus () == valid);
  253. // ASSERT (dateSpan.GetStatus () == valid);
  254. return m_span >= dateSpan.m_span;
  255. }
  256. __inline const DDateTimeSpan& DDateTimeSpan::operator += (const DDateTimeSpan dateSpan)
  257. { *this = *this + dateSpan; return *this; }
  258. __inline const DDateTimeSpan& DDateTimeSpan::operator -= (const DDateTimeSpan dateSpan)
  259. { *this = *this - dateSpan; return *this; }
  260. __inline DDateTimeSpan DDateTimeSpan::operator - () const
  261. { return -this->m_span; }
  262. __inline DDateTimeSpan::operator double () const
  263. { return m_span; }
  264. #endif