DCL 3.7.4
Loading...
Searching...
No Matches
DateTime.cpp
Go to the documentation of this file.
1#include <dcl/Config.h>
2
3#ifdef __WINNT__
4 #include <windows.h> // GetSystemTime
5 #include <sys/timeb.h> // _ftime_s
6 #include <time.h> // _get_timezone
7#else
8 #include <sys/time.h> // gettimeofday
9 #include <time.h> // localtime_r
10#endif
11
12#include <string.h> // memset
13#include <wchar.h> // wcsftime
14
15#include <dcl/DateTime.h>
16
17#if __DCL_HAVE_ALLOC_DEBUG
18#undef __DCL_ALLOC_LEVEL
19#define __DCL_ALLOC_LEVEL __DCL_ALLOC_INTERNAL
20#endif
21
22#if __DCL_HAVE_THIS_FILE__
23#undef __THIS_FILE__
24static const char_t __THIS_FILE__[] = __T("dcl/DateTime.cpp");
25#endif
26
27__DCL_BEGIN_NAMESPACE
28
30{
31 __jday = 0;
32}
33
34Date::Date(const Date& _src)
35{
36 __jday = _src.__jday;
37}
38
39Date::Date(int _year, int _month, int _day)
40{
41 assign(_year, _month, _day);
42}
43
44Date::Date(long _days)
45{
46 assign(_days);
47}
48
49void Date::assign(int _year, int _month, int _day)
50{
51 __DCL_ASSERT(Date::isValid(_year, _month, _day));
52
54 _year,
55 _month,
56 _day
57 );
58}
59
60#define AD_START 220866926 // 0001-01-01
61#define BC_END (AD_START - 367) // -0001-01-31
62
63void Date::assign(long _days)
64{
65 if (_days < 0)
66 __jday = _days + BC_END + 1;
67 else if (_days > 0)
68 __jday = _days + AD_START - 1;
69 else
70 // set NULL date
71 __jday = _days;
72}
73
74long Date::days() const
75{
76 if (__jday <= BC_END)
77 return __jday - BC_END - 1;
78 else if (__jday >= AD_START)
79 return __jday - AD_START + 1;
80 else {
81 __DCL_ASSERT(__jday == 0);
82 return __jday;
83 }
84}
85
87{
88 __DCL_ASSERT(__jday != 0);
89
90 if (__jday == BC_END)
92 else
93 __jday++;
94
95 return *this;
96}
97
99{
100 __DCL_ASSERT(__jday != 0);
101
102 Date r = *this;
103
104 if (__jday == BC_END)
106 else
107 __jday++;
108
109 return r;
110}
111
113{
114 __DCL_ASSERT(__jday != 0);
115
116 if (__jday == AD_START)
117 __jday = BC_END;
118 else
119 __jday--;
120
121 return *this;
122}
123
125{
126 __DCL_ASSERT(__jday != 0);
127
128 Date r = *this;
129
130 if (__jday == AD_START)
131 __jday = BC_END;
132 else
133 __jday--;
134
135 return r;
136}
137
138const Date& Date::operator = (const Date& _src)
139{
140 __jday = _src.__jday;
141 return *this;
142}
143
144const Date& Date::operator += (long _days)
145{
146 __DCL_ASSERT(__jday != 0);
147
148 if (__jday <= BC_END) {
149 __jday += _days - BC_END;
150
151 if (__jday <= 0)
152 __jday += BC_END;
153 else
154 __jday += AD_START - 1;
155 }
156 else {
158
159 __jday += _days - AD_START;
160
161 if (__jday >= 0)
162 __jday += AD_START;
163 else
164 __jday += BC_END + 1;
165 }
166
167 return *this;
168}
169
170const Date& Date::operator -= (long _days)
171{
172 __DCL_ASSERT(__jday != 0);
173
174 return operator += (-_days);
175}
176
177DCLCAPI Date operator + (const Date& _date, long _days)
178{
179 Date r = _date;
180 r += _days;
181 return r;
182}
183
184void Date::decode(int& _year, int& _month, int& _day) const
185{
186 convertJulianToGregorian(__jday, _year, _month, _day);
187}
188
189int Date::year() const
190{
191 int year, month, day;
193 return year;
194}
195
196int Date::month() const
197{
198 int year, month, day;
200 return month;
201}
202
203int Date::day() const
204{
205 int year, month, day;
207 return day;
208}
209
211{
212 return (((__jday + 1) % 7) + 7) % 7 + 1;
213}
214
216{
217 return __jday - convertGregorianToJulian(year(), 1, 1) + 1;
218}
219
220static const int __monthDays__[] =
221{
222// 1 2 3 4 5 6 7 8 9 10 11 12
223 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
224};
225
227{
228 int year, month, day;
230 if (month == 2 && isLeapYear(year))
231 return 29;
232
233 return __monthDays__[month];
234}
235
237{
238 int year, month, day;
240
241 if (isLeapYear(year))
242 return 366;
243 return 365;
244}
245
246static inline int __ABS(int _n)
247{
248 return _n < 0 ? -_n : _n;
249}
250
251String Date::toString() const
252{
253 int year, month, day;
254 decode(year, month, day);
255 String r = String::format(L"%04d-%02d-%02d", __ABS(year), month, day);
256 if (year < 0) {
257 r = r + L" BC";
258 }
259 return r;
260}
261
262const wchar_t* Date::FORMAT_STRING = L"%Y-%m-%d";
263
264String Date::toStringF(const wchar_t* _format) const
265{
266 if (!_format)
267 _format = FORMAT_STRING;
268
269 __DCL_ASSERT(*_format != L'\0');
270
271 int year, month, day;
272 decode(year, month, day);
273
274 struct tm _time;
275 memset(&_time, 0, sizeof(struct tm));
276 _time.tm_year = year - 1900;
277 _time.tm_mon = month - 1;
278 _time.tm_mday = day;
279 _time.tm_isdst = -1;
280
281 CharBuffer* buf = CharBuffer::create(DATETIME_FORMAT_BUFFER_SIZE);
282 size_t n = wcsftime(buf->data(), DATETIME_FORMAT_BUFFER_SIZE, _format, &_time);
283 __DCL_ASSERT(buf->__allocLength >= n);
284 buf->__dataLength = n;
285
286 String r = buf;
287 buf->release();
288 return r;
289}
290
291// 알고리즘 출처
292// Communications of the ACM, Vol 6, No 8.
294 int _y, int _m, int _d
295)
296{
297 if (_y == 0) {
298 __DCL_ASSERT(_m == 0 && _d == 0);
299 return 0;
300 }
301
302 _y += 600000;
303
304 int c, ya;
305 if (_m > 2)
306 _m -= 3;
307 else {
308 _m += 9;
309 _y--;
310 }
311 c = _y / 100;
312 ya = _y - 100 * c;
313
314 return (146097 * c) / 4
315 + (1461 * ya) / 4
316 + (153 * _m + 2) / 5
317 + _d
318 + 1721119;
319}
320
322 long _j,
323 int& _y, int& _m, int& _d
324)
325{
326 if (_j == 0) {
327 _y = 0;
328 _m = 0;
329 _d = 0;
330 }
331 else {
332 _j -= 1721119;
333
334 _y = (4 * _j - 1) / 146097;
335 _j = 4 * _j - 1 - 146097 * _y;
336 _d = _j / 4;
337
338 _j = (4 * _d + 3) / 1461;
339 _d = 4 * _d + 3 - 1461 * _j;
340 _d = (_d + 4) / 4;
341
342 _m = (5 * _d - 3) / 153;
343 _d = 5 * _d - 3 - 153 * _m;
344 _d = (_d + 5 ) / 5;
345
346 _y = 100 * _y + _j;
347 if (_m < 10)
348 _m += 3;
349 else {
350 _m -= 9;
351 _y++;
352 }
353
354 _y -= 600000;
355 }
356}
357
358bool Date::isValid(int _y, int _m, int _d)
359{
360 if (_y == 0) {
361 // null date
362 if (_m == 0 && _d == 0)
363 return true;
364 }
365 else {
366 if ((-9999 <= _y && _y <= 9999) &&
367 (0 < _m && _m <= 12)
368 && (0 < _d)) {
369 if (_m == 2 && _d == 29)
370 return Date::isLeapYear(_y);
371 else
372 return _d <= __monthDays__[_m];
373 }
374 }
375 return false;
376}
377
379{
380 return (_y % 4 == 0 && _y % 100 != 0) || _y % 400 == 0;
381}
382
384
386{
387 __milliseconds = 0;
388}
389
390Time::Time(const Time& _src)
391{
393}
394
395#define SEC_PER_DAY 86400
396#define MSEC_PER_DAY 86400000
397#define SEC_PER_HOUR 3600
398#define MSEC_PER_HOUR 3600000
399#define SEC_PER_MIN 60
400#define MSEC_PER_MIN 60000
401
402Time::Time(int _hour, int _min, int _sec, int _millisecond /* = 0 */)
403{
404 assign(_hour, _min, _sec, _millisecond);
405}
406
407Time::Time(long _milliseconds)
408{
409 assign(_milliseconds);
410}
411
412void Time::assign(int _hour, int _min, int _sec, int _millisecond /* = 0 */)
413{
414 long msec = _hour * MSEC_PER_HOUR
415 + _min * MSEC_PER_MIN
416 + _sec * 1000
417 + _millisecond;
418
419 msec %= MSEC_PER_DAY;
420 msec += MSEC_PER_DAY;
422}
423
424void Time::assign(long _milliseconds)
425{
426 _milliseconds %= MSEC_PER_DAY;
427 _milliseconds += MSEC_PER_DAY;
428 __milliseconds = _milliseconds % MSEC_PER_DAY;
429}
430
431const Time& Time::operator = (const Time& _src)
432{
434 return *this;
435}
436
437const Time& Time::operator += (long _milliseconds)
438{
439 long msec = __milliseconds + _milliseconds;
440 msec %= MSEC_PER_DAY;
441 msec += MSEC_PER_DAY;
443
444 return *this;
445}
446
447const Time& Time::operator -= (long _milliseconds)
448{
449 long msec = __milliseconds - _milliseconds;
450 msec %= MSEC_PER_DAY;
451 msec += MSEC_PER_DAY;
453
454 return *this;
455}
456
457DCLCAPI Time operator + (const Time& _time, long _milliseconds)
458{
459 Time result = _time;
460 result += _milliseconds;
461 return result;
462}
463
464void Time::decode(int& _hour, int& _min, int& _sec, int& _millisecond) const
465{
468 _sec = (__milliseconds % MSEC_PER_MIN) / 1000;
469 _millisecond = __milliseconds % 1000;
470}
471
472int Time::hour() const // 0 ~ 23
473{
475}
476
477int Time::minute() const // 0 ~ 59
478{
480}
481
482int Time::second() const // 0 ~ 59
483{
484 return (__milliseconds % MSEC_PER_MIN) / 1000;
485}
486
487int Time::msecond() const // 0 ~ 999
488{
489 return __milliseconds % 1000;
490}
491
492// HH:MM:SS.MS
493String Time::toString() const
494{
495 return String::format(
496 L"%02d:%02d:%02d.%03d",
497 hour(),
498 minute(),
499 second(),
500 msecond()
501 );
502}
503
504const wchar_t* Time::FORMAT_STRING = L"%H:%M:%S";
505
506String Time::toStringF(const wchar_t* _format)
507{
508 if (!_format)
509 _format = FORMAT_STRING;
510
511 __DCL_ASSERT(*_format != L'\0');
512
513 struct tm _time;
514 memset(&_time, 0, sizeof(struct tm));
515 _time.tm_hour = hour();
516 _time.tm_min = minute();
517 _time.tm_sec = second();
518 _time.tm_isdst = -1;
519
520 CharBuffer* buf = CharBuffer::create(DATETIME_FORMAT_BUFFER_SIZE);
521 size_t n = wcsftime(buf->data(), DATETIME_FORMAT_BUFFER_SIZE, _format, &_time);
522 __DCL_ASSERT(buf->__allocLength <= n);
523 buf->__dataLength = n;
524
525 String r = buf;
526 buf->release();
527 return r;
528}
529
530// static members
531bool Time::isValid(int _hour, int _min, int _sec, int _millisecond)
532{
533 return (0 <= _hour && _hour <= 23)
534 && (0 <= _min && _min <= 59)
535 && (0 <= _sec && _sec <= 59)
536 && (0 <= _millisecond && _millisecond <= 999);
537}
538
540
545
547{
549}
550
551Interval::Interval(int _days, int _milliseconds)
552{
553 assign(_days, _milliseconds);
554}
555
557 int _days,
558 int _hours, int _minutes, int _seconds,
559 int _milliseconds
560)
561{
562 assign(_days, _hours, _minutes, _seconds, _milliseconds);
563}
564
565Interval::Interval(int64_t _milliseconds)
566{
567 assign(_milliseconds);
568}
569
570void Interval::assign(int _days, int _milliseconds)
571{
572 __milliseconds = (int64_t)_days * MSEC_PER_DAY + _milliseconds;
573}
574
576 int _days,
577 int _hours, int _minutes, int _seconds,
578 int _milliseconds
579)
580{
581 __milliseconds= (int64_t)_days * MSEC_PER_DAY
582 + (int64_t)_hours * MSEC_PER_HOUR
583 + (int64_t)_minutes * MSEC_PER_MIN
584 + _seconds * 1000
585 + _milliseconds;
586}
587
588void Interval::assign(int64_t _milliseconds)
589{
590 __milliseconds = _milliseconds;
591}
592
594{
596
597 return *this;
598}
599
601{
603
604 return *this;
605}
606
608{
610
611 return *this;
612}
613
615{
617 return r;
618}
619
621{
623 return r;
624}
625
626void Interval::decode(long& _days,
627 int& _hours, int& _minutes, int& _seconds,
628 int& _milliseconds
629) const
630{
631 _days = (long)(__milliseconds / MSEC_PER_DAY);
632 _hours = (int)((__milliseconds % MSEC_PER_DAY) / MSEC_PER_HOUR);
633 _minutes = (int)((__milliseconds % MSEC_PER_HOUR) / MSEC_PER_MIN);
634 _seconds = (int)((__milliseconds % MSEC_PER_MIN) / 1000);
635 _milliseconds = (int)(__milliseconds % 1000);
636}
637
638void Interval::decode(long& _days, long& _milliseconds) const
639{
640 _days = (long)(__milliseconds / MSEC_PER_DAY);
641 _milliseconds = (long)(__milliseconds % MSEC_PER_DAY);
642}
643
644long Interval::days() const
645{
646 return (long)(__milliseconds / MSEC_PER_DAY);
647}
648
649int Interval::hour() const
650{
651 return (int)((__milliseconds % MSEC_PER_DAY) / MSEC_PER_HOUR);
652}
653
655{
656 return (int)((__milliseconds % MSEC_PER_HOUR) / MSEC_PER_MIN);
657}
658
660{
661 return (int)((__milliseconds % MSEC_PER_MIN) / 1000);
662}
663
665{
666 return (int)(__milliseconds % 1000);
667}
668
669int64_t Interval::totalHours() const
670{
672}
673
675{
677}
678
680{
681 return __milliseconds / 1000;
682}
683
684String Interval::toString() const
685{
686 long d;
687 int h, m, s, msec;
688 decode(d, h, m, s, msec);
689 if (__milliseconds < 0) {
690 return String::format(
691 L"-%ld %02d:%02d:%02d.%03d",
692 -d,
693 -h, -m, -s, -msec
694 );
695 }
696 else {
697 return String::format(
698 L"+%ld %02d:%02d:%02d.%03d",
699 d,
700 h, m, s, msec
701 );
702 }
703}
704
705// static members
706
709{
710 __date = _src.__date;
711 __time = _src.__time;
712}
713
714DateTime::DateTime(time_t _timer)
715{
716 assign(_timer);
717}
718
719DateTime::DateTime(const Date& _date, const Time& _time)
720{
721 __date = _date;
722 __time = _time;
723}
724
725DateTime::DateTime(int _year, int _month, int _day,
726 int _hour, int _min, int _sec, int _millisecond /* = 0 */)
727{
728 __date.assign(_year, _month, _day);
729 __time.assign(_hour, _min, _sec, _millisecond);
730}
731
732static bool __tzset__ =
733false;
734static long __get_timezone__()
735{
736#ifdef __WINNT__
737#define tzset _tzset
738#endif
739 if (!__tzset__) {
740 tzset();
741 __tzset__ = true;
742 }
743#ifdef __WINNT__
744 long timezone = 0;
745 _get_timezone(&timezone);
746#endif
747 return -timezone;
748}
749
750void DateTime::assign(time_t _timer)
751{
752 long tm_gmtoff = __get_timezone__();
753
754 __date.assign(
755 (long) (719163 + ((_timer + tm_gmtoff) / SEC_PER_DAY)) // 1970-01-01 00:00:00 + time
756 );
757 __time.assign(
758 0,
759 0,
760 _timer % SEC_PER_DAY + tm_gmtoff,
761 0
762 );
763}
764
765void DateTime::assign(const Date& _date, const Time& _time)
766{
767 __date = _date;
768 __time = _time;
769}
770
771void DateTime::assign(int _year, int _month, int _day,
772 int _hour, int _min, int _sec, int _millisecond /* = 0 */)
773{
774 __date.assign(_year, _month, _day);
775 __time.assign(_hour, _min, _sec, _millisecond);
776}
777
779{
780 __date = _src.__date;
781 __time = _src.__time;
782
783 return *this;
784}
785
787{
788 int64_t msec = (int64_t)__date.days() * MSEC_PER_DAY
789 + (int64_t)__time.totalMilliSeconds()
790 + _iv.totalMilliSeconds();
791
792 __date.assign((long)(msec / MSEC_PER_DAY));
793 __time.assign((long)(msec % MSEC_PER_DAY));
794
795 return *this;
796}
797
799{
800 int64_t msec = (int64_t)__date.days() * MSEC_PER_DAY
801 + (int64_t)__time.totalMilliSeconds()
802 - _iv.totalMilliSeconds();
803
804 __date.assign((long)(msec / MSEC_PER_DAY));
805 __time.assign((long)(msec % MSEC_PER_DAY));
806
807 return *this;
808}
809
811{
812 DateTime r = _dt;
813 r += _iv;
814 return r;
815}
816
818{
819 return operator + (_dt, _iv);
820}
821
823{
824 DateTime r = _dt;
825 r -= _iv;
826
827 return r;
828}
829
831{
832 Interval r(
833 (int64_t)_dt1.date().days() * MSEC_PER_DAY
834 + (int64_t)_dt1.time().totalMilliSeconds()
835 - (int64_t)_dt2.date().days() * MSEC_PER_DAY
836 - (int64_t)_dt2.time().totalMilliSeconds()
837 );
838
839 return r;
840}
841
842// Date::toString() + Time::toString()
843String DateTime::toString() const
844{
845 return __date.toString() + L" " + __time.toString();
846}
847
848const wchar_t* DateTime::FORMAT_STRING = L"%Y-%m-%d %H:%M:%S";
849
850// strftime
851String DateTime::toStringF(const wchar_t* _format) const
852{
853 if (!_format)
854 _format = FORMAT_STRING;
855
856 __DCL_ASSERT(*_format != L'\0');
857
858 int year, month, day, hour, min, sec, msec;
859 __date.decode(year, month, day);
860 __time.decode(hour, min, sec, msec);
861
862 struct tm time;
863 time.tm_year = year - 1900;
864 time.tm_mon = month - 1;
865 time.tm_mday = day;
866 time.tm_hour = hour;
867 time.tm_min = min;
868 time.tm_sec = sec;
869
870 time.tm_wday = 0;
871 time.tm_yday = 0;
872 time.tm_isdst = -1;
873
874 CharBuffer* buf = CharBuffer::create(DATETIME_FORMAT_BUFFER_SIZE);
875 size_t n = wcsftime(buf->data(), DATETIME_FORMAT_BUFFER_SIZE, _format, &time);
876 __DCL_ASSERT(buf->__allocLength >= n);
877 buf->__dataLength = n;
878 __DCL_ASSERT(buf->data()[buf->__dataLength] == __T('\0'));
879
880 String r = buf;
881 buf->release();
882 return r;
883}
884
885// static members
886int DateTime::compare(const DateTime& _dt1, const DateTime& _dt2)
887{
888 if (_dt1.__date < _dt2.__date)
889 return -1;
890 else if (_dt1.__date == _dt2.__date) {
891 if (_dt1.__time < _dt2.__time)
892 return -1;
893 else if (_dt1.__time == _dt2.__time)
894 return 0;
895 }
896 return 1;
897}
898
900{
901#ifdef __WINNT__
902 SYSTEMTIME time;
903 GetSystemTime(&time);
904
905 Date dt(time.wYear, time.wMonth, time.wDay);
906 int64_t r = dt.days() * 24;
907 r = (r + time.wHour) * 60;
908 r = (r + time.wMinute) * 60;
909 r = (r + time.wSecond) * 1000;
910 r += time.wMilliseconds;
911 return r;
912#else
913 struct timeval tv;
914 gettimeofday(&tv, NULL);
915 int64_t r = tv.tv_sec * 1000;
916 r += tv.tv_usec / 1000;
917 return r;
918#endif
919}
920
922{
923 DateTime r;
924#ifdef __WINNT__
925 struct _timeb timeb;
926 _ftime_s(&timeb);
927
928 r.__date.assign(
929 (long) (719163 + (timeb.time / SEC_PER_DAY)) // 1970-01-01 00:00:00 + time
930 );
931 r.__time.assign(
932 0,
933 0,
934 timeb.time % SEC_PER_DAY,
935 timeb.millitm
936 );
937#else
938 struct timeval tv;
939 gettimeofday(&tv, NULL);
940
941 r.__date.assign(
942 719163 + tv.tv_sec / SEC_PER_DAY // 1970-01-01 00:00:00 + time
943 );
944 r.__time.assign(
945 0,
946 0,
947 tv.tv_sec % SEC_PER_DAY,
948 tv.tv_usec / 1000
949 );
950#endif
951 return r;
952}
953
955{
956 DateTime r;
957#ifdef __WINNT__
958 struct _timeb timeb;
959 _ftime_s(&timeb);
960
961 r.__date.assign(
962 (long) (719163 + ((timeb.time - timeb.timezone * 60) / SEC_PER_DAY)) // 1970-01-01 00:00:00 + time
963 );
964 r.__time.assign(
965 0,
966 -timeb.timezone,
967 timeb.time % SEC_PER_DAY,
968 timeb.millitm
969 );
970#else
971 long tm_gmtoff = __get_timezone__();
972
973 struct timeval tv;
974 gettimeofday(&tv, NULL);
975
976 r.__date.assign(
977 719163 + (tv.tv_sec + tm_gmtoff) / SEC_PER_DAY // 1970-01-01 00:00:00 + time
978 );
979 r.__time.assign(
980 0,
981 0,
982 tv.tv_sec % SEC_PER_DAY + tm_gmtoff,
983 tv.tv_usec / 1000
984 );
985#endif
986 return r;
987}
988
989#if 0
990DateTime DateTime::parseF(
991 const char* pszDateTimeString,
992 const char* _format
994{
995 __DCL_ASSERT(pszDateTimeString != NULL && *pszDateTimeString != '\0');
996 __DCL_ASSERT(_format != NULL && *_format != '\0');
997
998 struct tm tm;
999 memset(&tm, 0, sizeof(tm));
1000 const char* p = strptime(pszDateTimeString, _format, &tm);
1001 if (p == NULL) {
1002 throw new ParseException(L"no match to format");
1003 }
1004
1005 if (*p != '\0') {
1006 throw new ParseException(
1007 L"extra data",
1008 p - pszDateTimeString
1009 );
1010
1011 }
1012
1013 DateTime _dt2(
1014 tm.tm_year + 1900,
1015 tm.tm_mon + 1,
1016 tm.tm_mday,
1017 tm.tm_hour,
1018 tm.tm_min,
1019 tm.tm_sec
1020 );
1021
1022 return _dt2;
1023}
1024#endif
1025
1026__DCL_END_NAMESPACE
#define __THIS_FILE__
Definition _trace.h:14
#define NULL
Definition Config.h:312
#define DCLCAPI
Definition Config.h:95
wchar_t char_t
Definition Config.h:247
#define __DCL_THROWS1(e)
Definition Config.h:152
#define MSEC_PER_HOUR
Definition DateTime.cpp:398
#define SEC_PER_DAY
Definition DateTime.cpp:395
DCLCAPI Interval operator-(const Interval &_iv1, const Interval &_iv2)
Definition DateTime.cpp:620
DCLCAPI Date operator+(const Date &_date, long _days)
Definition DateTime.cpp:177
#define AD_START
Definition DateTime.cpp:60
#define BC_END
Definition DateTime.cpp:61
#define MSEC_PER_DAY
Definition DateTime.cpp:396
#define MSEC_PER_MIN
Definition DateTime.cpp:400
#define DATETIME_FORMAT_BUFFER_SIZE
Definition DateTime.h:21
IOException *size_t r
Definition MediaInfo.cpp:82
#define __ABS(n)
Definition MyParam.cpp:145
#define __DCL_ASSERT(expr)
Definition Object.h:394
#define __T(str)
Definition Object.h:60
const Date & operator=(const Date &_src)
Definition DateTime.cpp:138
long __jday
Definition DateTime.h:75
const Date & operator--()
Definition DateTime.cpp:112
void assign(int _year, int _month, int _day)
Definition DateTime.cpp:49
long days() const
Definition DateTime.cpp:74
int day() const
Definition DateTime.cpp:203
static long convertGregorianToJulian(int _year, int _month, int _day)
Definition DateTime.cpp:293
static bool isValid(int y, int m, int d)
Definition DateTime.cpp:358
static void convertJulianToGregorian(long uJulianDays, int &_year, int &_month, int &_day)
Definition DateTime.cpp:321
String toStringF(const wchar_t *_format=NULL) const
Definition DateTime.cpp:264
int daysInYear() const
Definition DateTime.cpp:236
int month() const
Definition DateTime.cpp:196
static const wchar_t * FORMAT_STRING
Definition DateTime.h:66
String toString() const
Definition DateTime.cpp:251
const Date & operator++()
Definition DateTime.cpp:86
int dayOfWeek() const
Definition DateTime.cpp:210
int daysInMonth() const
Definition DateTime.cpp:226
const Date & operator+=(long _days)
Definition DateTime.cpp:144
void decode(int &_year, int &_month, int &_day) const
Definition DateTime.cpp:184
const Date & operator-=(long _days)
Definition DateTime.cpp:170
Date()
Definition DateTime.cpp:29
int year() const
Definition DateTime.cpp:189
static bool isLeapYear(int _year)
Definition DateTime.cpp:378
int dayOfYear() const
Definition DateTime.cpp:215
const DateTime & operator+=(const Interval &_iv)
Definition DateTime.cpp:786
void assign(time_t _timer)
Definition DateTime.cpp:750
Time & time()
Definition DateTime.inl:162
String toString() const
Definition DateTime.cpp:843
const DateTime & operator=(const DateTime &_src)
Definition DateTime.cpp:778
static const wchar_t * FORMAT_STRING
Definition DateTime.h:246
Time __time
Definition DateTime.h:275
static DateTime getCurrentUTCTime()
Definition DateTime.cpp:921
static int64_t getCurrentTimeMillis()
Definition DateTime.cpp:899
String toStringF(const wchar_t *_format=NULL) const
Definition DateTime.cpp:851
Date & date()
Definition DateTime.inl:152
Date __date
Definition DateTime.h:274
static DateTime getCurrentLocalTime()
Definition DateTime.cpp:954
static int compare(const DateTime &_dt1, const DateTime &_dt2)
Definition DateTime.cpp:886
const DateTime & operator-=(const Interval &_iv)
Definition DateTime.cpp:798
long days() const
Definition DateTime.cpp:644
int64_t totalHours() const
Definition DateTime.cpp:669
int64_t totalMinutes() const
Definition DateTime.cpp:674
void assign(int _days, int _milliseconds)
Definition DateTime.cpp:570
int hour() const
Definition DateTime.cpp:649
int64_t totalSeconds() const
Definition DateTime.cpp:679
String toString() const
Definition DateTime.cpp:684
void decode(long &_days, int &_hours, int &_minutes, int &_seconds, int &_milliseconds) const
Definition DateTime.cpp:626
int minute() const
Definition DateTime.cpp:654
int64_t totalMilliSeconds() const
Definition DateTime.inl:116
const Interval & operator-=(const Interval &_iv)
Definition DateTime.cpp:607
const Interval & operator+=(const Interval &_iv)
Definition DateTime.cpp:600
const Interval & operator=(const Interval &_src)
Definition DateTime.cpp:593
int64_t __milliseconds
Definition DateTime.h:204
int msecond() const
Definition DateTime.cpp:664
int second() const
Definition DateTime.cpp:659
String toStringF(const wchar_t *_format=NULL)
Definition DateTime.cpp:506
const Time & operator=(const Time &_src)
Definition DateTime.cpp:431
int hour() const
Definition DateTime.cpp:472
int second() const
Definition DateTime.cpp:482
void decode(int &_hour, int &_min, int &_sec, int &_millisecond) const
Definition DateTime.cpp:464
static const wchar_t * FORMAT_STRING
Definition DateTime.h:127
int msecond() const
Definition DateTime.cpp:487
static bool isValid(int _hour, int _min, int _sec, int _millisecond)
Definition DateTime.cpp:531
const Time & operator-=(long _milliseconds)
Definition DateTime.cpp:447
int minute() const
Definition DateTime.cpp:477
unsigned long __milliseconds
Definition DateTime.h:136
void assign(int _hour, int _min, int _sec, int _millisecond=0)
Definition DateTime.cpp:412
String toString() const
Definition DateTime.cpp:493
long totalMilliSeconds() const
Definition DateTime.inl:65
const Time & operator+=(long _milliseconds)
Definition DateTime.cpp:437