00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __DATE_H__
00012 #define __DATE_H__
00013
00014 #include "stdtp.h"
00015 #include "class.h"
00016
00017 BEGIN_GIGABASE_NAMESPACE
00018
00022 class GIGABASE_DLL_ENTRY dbDate {
00023 int4 jday;
00024 public:
00025 bool operator == (dbDate const& dt) {
00026 return jday == dt.jday;
00027 }
00028 bool operator != (dbDate const& dt) {
00029 return jday != dt.jday;
00030 }
00031 bool operator > (dbDate const& dt) {
00032 return jday > dt.jday;
00033 }
00034 bool operator >= (dbDate const& dt) {
00035 return jday >= dt.jday;
00036 }
00037 bool operator < (dbDate const& dt) {
00038 return jday < dt.jday;
00039 }
00040 bool operator <= (dbDate const& dt) {
00041 return jday <= dt.jday;
00042 }
00043 int operator - (dbDate const& dt) {
00044 return jday - dt.jday;
00045 }
00046
00050 int operator + (int days) {
00051 return jday + days;
00052 }
00053
00054 dbDate& operator += (int days) {
00055 jday += days;
00056 return *this;
00057 }
00058
00059 dbDate& operator -= (int days) {
00060 jday -= days;
00061 return *this;
00062 }
00063
00067 static dbDate current() {
00068 #ifdef _WINCE
00069 LPSYSTEMTIME st;
00070 GetSystemTime(&st);
00071 return dbDate(st.wYear, st.wMonth, st.wDay);
00072 #else
00073 time_t now = time(NULL);
00074 struct tm* tp;
00075 #if HAVE_LOCALTIME_R
00076 struct tm t;
00077 tp = localtime_r(&now, &t);
00078 #else
00079 tp = localtime(&now);
00080 #endif
00081 return dbDate(tp->tm_year + 1900, tp->tm_mon + 1, tp->tm_mday);
00082 #endif
00083 }
00084
00088 dbDate() {
00089 jday = -1;
00090 }
00091
00095 bool isValid() const {
00096 return jday != -1;
00097 }
00098
00102 unsigned JulianDay() { return jday; }
00103
00107 void clear() { jday = -1; }
00108
00119 dbDate(int year, int month, int day) {
00120
00121
00122 nat4 c, ya;
00123 if (month > 2)
00124 month -= 3;
00125 else {
00126 month += 9;
00127 year--;
00128 }
00129 c = year / 100;
00130 ya = year - 100*c;
00131 jday = ((146097*c)>>2) + ((1461*ya)>>2) + (153*month + 2)/5 + day + 1721119;
00132 }
00133
00143 void MDY(int& year, int& month, int& day) const {
00144 nat4 j = jday - 1721119;
00145 int m, d, y;
00146 y = (((j<<2) - 1) / 146097);
00147 j = (j<<2) - 1 - 146097*y;
00148 d = (j>>2);
00149 j = ((d<<2) + 3) / 1461;
00150 d = ((d<<2) + 3 - 1461*j);
00151 d = (d + 4)>>2;
00152 m = (5*d - 3)/153;
00153 d = 5*d - 3 - 153*m;
00154 d = (d + 5)/5;
00155 y = (100*y + j);
00156 if (m < 10) {
00157 m += 3;
00158 } else {
00159 m -= 9;
00160 y++;
00161 }
00162 month = m;
00163 day = d;
00164 year = y;
00165 }
00166
00171 int day() {
00172 int month, day, year;
00173 MDY(year, month, day);
00174 return day;
00175 }
00176
00181 int month() {
00182 int month, day, year;
00183 MDY(year, month, day);
00184 return month;
00185 }
00186
00191 int year() {
00192 int month, day, year;
00193 MDY(year, month, day);
00194 return year;
00195 }
00196
00201 int dayOfWeek() {
00202 return (jday % 7) + 1;
00203 }
00204
00219 char* asString(char* buf, char const* format = "%d-%M-%Y") const {
00220 static const char* dayName[] = { "Mon", "Tue", "Wen", "Thu", "Fri", "Sat", "Sun" };
00221 static const char* monthName[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
00222 "Aug", "Sep", "Oct", "Nov", "Dec" };
00223 int month, day, year;
00224 MDY(year, month, day);
00225 char ch, *dst = buf;
00226 while ((ch = *format++) != '\0') {
00227 if (ch == '%') {
00228 ch = *format++;
00229 switch (ch) {
00230 case 'd': dst += sprintf(dst, "%02u", day ); continue;
00231 case 'D': dst += sprintf(dst, "%s", dayName[jday % 7]); continue;
00232 case 'm': dst += sprintf(dst, "%02u", month); continue;
00233 case 'M': dst += sprintf(dst, "%s", monthName[month - 1]); continue;
00234 case 'y': dst += sprintf(dst, "%02u", year - 1900); continue;
00235 case 'Y': dst += sprintf(dst, "%04u", year); continue;
00236 default: *dst++ = ch;
00237 }
00238 } else {
00239 *dst++ = ch;
00240 }
00241 }
00242 *dst = '\0';
00243 return buf;
00244 }
00245
00246
00247 CLASS_DESCRIPTOR(dbDate,
00248 (KEY(jday,INDEXED|HASHED),
00249 METHOD(year), METHOD(month), METHOD(day), METHOD(dayOfWeek)));
00250
00256 dbQueryExpression operator == (char const* field) {
00257 dbQueryExpression expr;
00258 expr = dbComponent(field,"jday"),"=",jday;
00259 return expr;
00260 }
00261
00267 dbQueryExpression operator != (char const* field) {
00268 dbQueryExpression expr;
00269 expr = dbComponent(field,"jday"),"<>",jday;
00270 return expr;
00271 }
00272
00278 dbQueryExpression operator < (char const* field) {
00279 dbQueryExpression expr;
00280 expr = dbComponent(field,"jday"),">",jday;
00281 return expr;
00282 }
00283
00289 dbQueryExpression operator <= (char const* field) {
00290 dbQueryExpression expr;
00291 expr = dbComponent(field,"jday"),">=",jday;
00292 return expr;
00293 }
00294
00300 dbQueryExpression operator > (char const* field) {
00301 dbQueryExpression expr;
00302 expr = dbComponent(field,"jday"),"<",jday;
00303 return expr;
00304 }
00305
00311 dbQueryExpression operator >= (char const* field) {
00312 dbQueryExpression expr;
00313 expr = dbComponent(field,"jday"),"<=",jday;
00314 return expr;
00315 }
00316
00324 friend dbQueryExpression between(char const* field, dbDate& from,
00325 dbDate& till)
00326 {
00327 dbQueryExpression expr;
00328 expr=dbComponent(field,"jday"),"between",from.jday,"and",till.jday;
00329 return expr;
00330 }
00331
00336 static dbQueryExpression ascent(char const* field) {
00337 dbQueryExpression expr;
00338 expr=dbComponent(field,"jday");
00339 return expr;
00340 }
00341
00346 static dbQueryExpression descent(char const* field) {
00347 dbQueryExpression expr;
00348 expr=dbComponent(field,"jday"),"desc";
00349 return expr;
00350 }
00351 };
00352
00353 END_GIGABASE_NAMESPACE
00354
00355 #endif