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 time_t now = time(NULL);
00069 struct tm* tp;
00070 #if HAVE_LOCALTIME_R
00071 struct tm t;
00072 tp = localtime_r(&now, &t);
00073 #else
00074 tp = localtime(&now);
00075 #endif
00076 return dbDate(tp->tm_year + 1900, tp->tm_mon + 1, tp->tm_mday);
00077 }
00078
00082 dbDate() {
00083 jday = -1;
00084 }
00085
00089 bool isValid() {
00090 return jday != -1;
00091 }
00092
00096 unsigned JulianDay() { return jday; }
00097
00101 void clear() { jday = -1; }
00102
00113 dbDate(int year, int month, int day) {
00114
00115
00116 nat4 c, ya;
00117 if (month > 2)
00118 month -= 3;
00119 else {
00120 month += 9;
00121 year--;
00122 }
00123 c = year / 100;
00124 ya = year - 100*c;
00125 jday = ((146097*c)>>2) + ((1461*ya)>>2) + (153*month + 2)/5 + day + 1721119;
00126 }
00127
00137 void MDY(int& year, int& month, int& day) const {
00138 nat4 j = jday - 1721119;
00139 int m, d, y;
00140 y = (((j<<2) - 1) / 146097);
00141 j = (j<<2) - 1 - 146097*y;
00142 d = (j>>2);
00143 j = ((d<<2) + 3) / 1461;
00144 d = ((d<<2) + 3 - 1461*j);
00145 d = (d + 4)>>2;
00146 m = (5*d - 3)/153;
00147 d = 5*d - 3 - 153*m;
00148 d = (d + 5)/5;
00149 y = (100*y + j);
00150 if (m < 10) {
00151 m += 3;
00152 } else {
00153 m -= 9;
00154 y++;
00155 }
00156 month = m;
00157 day = d;
00158 year = y;
00159 }
00160
00165 int day() {
00166 int month, day, year;
00167 MDY(year, month, day);
00168 return day;
00169 }
00170
00175 int month() {
00176 int month, day, year;
00177 MDY(year, month, day);
00178 return month;
00179 }
00180
00185 int year() {
00186 int month, day, year;
00187 MDY(year, month, day);
00188 return year;
00189 }
00190
00195 int dayOfWeek() {
00196 return (jday % 7) + 1;
00197 }
00198
00213 char* asString(char* buf, char const* format = "%d-%M-%Y") const {
00214 static const char* dayName[] = { "Mon", "Tue", "Wen", "Thu", "Fri", "Sat", "Sun" };
00215 static const char* monthName[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
00216 "Aug", "Sep", "Oct", "Nov", "Dec" };
00217 int month, day, year;
00218 MDY(year, month, day);
00219 char ch, *dst = buf;
00220 while ((ch = *format++) != '\0') {
00221 if (ch == '%') {
00222 ch = *format++;
00223 switch (ch) {
00224 case 'd': dst += sprintf(dst, "%02u", day ); continue;
00225 case 'D': dst += sprintf(dst, "%s", dayName[jday % 7]); continue;
00226 case 'm': dst += sprintf(dst, "%02u", month); continue;
00227 case 'M': dst += sprintf(dst, "%s", monthName[month - 1]); continue;
00228 case 'y': dst += sprintf(dst, "%02u", year - 1900); continue;
00229 case 'Y': dst += sprintf(dst, "%04u", year); continue;
00230 default: *dst++ = ch;
00231 }
00232 } else {
00233 *dst++ = ch;
00234 }
00235 }
00236 *dst = '\0';
00237 return buf;
00238 }
00239
00240
00241 CLASS_DESCRIPTOR(dbDate,
00242 (KEY(jday,INDEXED|HASHED),
00243 METHOD(year), METHOD(month), METHOD(day), METHOD(dayOfWeek)));
00244
00250 dbQueryExpression operator == (char const* field) {
00251 dbQueryExpression expr;
00252 expr = dbComponent(field,"jday"),"=",jday;
00253 return expr;
00254 }
00255
00261 dbQueryExpression operator != (char const* field) {
00262 dbQueryExpression expr;
00263 expr = dbComponent(field,"jday"),"<>",jday;
00264 return expr;
00265 }
00266
00272 dbQueryExpression operator < (char const* field) {
00273 dbQueryExpression expr;
00274 expr = dbComponent(field,"jday"),">",jday;
00275 return expr;
00276 }
00277
00283 dbQueryExpression operator <= (char const* field) {
00284 dbQueryExpression expr;
00285 expr = dbComponent(field,"jday"),">=",jday;
00286 return expr;
00287 }
00288
00294 dbQueryExpression operator > (char const* field) {
00295 dbQueryExpression expr;
00296 expr = dbComponent(field,"jday"),"<",jday;
00297 return expr;
00298 }
00299
00305 dbQueryExpression operator >= (char const* field) {
00306 dbQueryExpression expr;
00307 expr = dbComponent(field,"jday"),"<=",jday;
00308 return expr;
00309 }
00310
00318 friend dbQueryExpression between(char const* field, dbDate& from,
00319 dbDate& till)
00320 {
00321 dbQueryExpression expr;
00322 expr=dbComponent(field,"jday"),"between",from.jday,"and",till.jday;
00323 return expr;
00324 }
00325
00330 static dbQueryExpression ascent(char const* field) {
00331 dbQueryExpression expr;
00332 expr=dbComponent(field,"jday");
00333 return expr;
00334 }
00335
00340 static dbQueryExpression descent(char const* field) {
00341 dbQueryExpression expr;
00342 expr=dbComponent(field,"jday"),"desc";
00343 return expr;
00344 }
00345 };
00346
00347 END_GIGABASE_NAMESPACE
00348
00349 #endif