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_FASTDB_NAMESPACE
00018
00019 #if !defined(NO_PTHREADS) && !defined(_WIN32)
00020 #define USE_REENTRANT_LIBRARY
00021 #endif
00022
00023 class FASTDB_DLL_ENTRY dbDate {
00024 int4 jday;
00025 public:
00026 bool operator == (dbDate const& dt) {
00027 return jday == dt.jday;
00028 }
00029 bool operator != (dbDate const& dt) {
00030 return jday != dt.jday;
00031 }
00032 bool operator > (dbDate const& dt) {
00033 return jday > dt.jday;
00034 }
00035 bool operator >= (dbDate const& dt) {
00036 return jday >= dt.jday;
00037 }
00038 bool operator < (dbDate const& dt) {
00039 return jday < dt.jday;
00040 }
00041 bool operator <= (dbDate const& dt) {
00042 return jday <= dt.jday;
00043 }
00044 int operator - (dbDate const& dt) {
00045 return jday - dt.jday;
00046 }
00047 int operator + (int days) {
00048 return jday + days;
00049 }
00050 dbDate& operator += (int days) {
00051 jday += days;
00052 return *this;
00053 }
00054 dbDate& operator -= (int days) {
00055 jday -= days;
00056 return *this;
00057 }
00058 static dbDate current() {
00059 time_t now = time(NULL);
00060 struct tm* tp;
00061 #ifdef USE_REENTRANT_LIBRARY
00062 struct tm t;
00063 tp = localtime_r(&now, &t);
00064 #else
00065 tp = localtime(&now);
00066 #endif
00067 return dbDate(tp->tm_year + 1900, tp->tm_mon + 1, tp->tm_mday);
00068 }
00069
00070 dbDate() {
00071 jday = -1;
00072 }
00073 bool isValid()const {
00074 return jday != -1;
00075 }
00076
00077 unsigned JulianDay() { return jday; }
00078
00079 void clear() { jday = -1; }
00080
00081 dbDate(int year, int month, int day) {
00082
00083
00084
00085
00086
00087
00088 nat4 c, ya;
00089 if (month > 2)
00090 month -= 3;
00091 else {
00092 month += 9;
00093 year--;
00094 }
00095 c = year / 100;
00096 ya = year - 100*c;
00097 jday = ((146097*c)>>2) + ((1461*ya)>>2) + (153*month + 2)/5 + day + 1721119;
00098 }
00099
00100 void MDY(int& year, int& month, int& day) const {
00101
00102
00103
00104
00105
00106
00107 nat4 j = jday - 1721119;
00108 int m, d, y;
00109 y = (((j<<2) - 1) / 146097);
00110 j = (j<<2) - 1 - 146097*y;
00111 d = (j>>2);
00112 j = ((d<<2) + 3) / 1461;
00113 d = ((d<<2) + 3 - 1461*j);
00114 d = (d + 4)>>2;
00115 m = (5*d - 3)/153;
00116 d = 5*d - 3 - 153*m;
00117 d = (d + 5)/5;
00118 y = (100*y + j);
00119 if (m < 10) {
00120 m += 3;
00121 } else {
00122 m -= 9;
00123 y++;
00124 }
00125 month = m;
00126 day = d;
00127 year = y;
00128 }
00129
00130 int day() {
00131 int month, day, year;
00132 MDY(year, month, day);
00133 return day;
00134 }
00135
00136 int month() {
00137 int month, day, year;
00138 MDY(year, month, day);
00139 return month;
00140 }
00141
00142 int year() {
00143 int month, day, year;
00144 MDY(year, month, day);
00145 return year;
00146 }
00147
00148 int dayOfWeek() {
00149 return (jday % 7) + 1;
00150 }
00151
00152 char* asString(char* buf, char const* format = "%d-%M-%Y") const {
00153 static const char* dayName[] = { "Mon", "Tue", "Wen", "Thu", "Fri", "Sat", "Sun" };
00154 static const char* monthName[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
00155 "Aug", "Sep", "Oct", "Nov", "Dec" };
00156 int month, day, year;
00157 MDY(year, month, day);
00158 char ch, *dst = buf;
00159 while ((ch = *format++) != '\0') {
00160 if (ch == '%') {
00161 ch = *format++;
00162 switch (ch) {
00163 case 'd': dst += sprintf(dst, "%02u", day ); continue;
00164 case 'D': dst += sprintf(dst, "%s", dayName[jday % 7]); continue;
00165 case 'm': dst += sprintf(dst, "%02u", month); continue;
00166 case 'M': dst += sprintf(dst, "%s", monthName[month - 1]); continue;
00167 case 'y': dst += sprintf(dst, "%02u", year - 1900); continue;
00168 case 'Y': dst += sprintf(dst, "%04u", year); continue;
00169 default: *dst++ = ch;
00170 }
00171 } else {
00172 *dst++ = ch;
00173 }
00174 }
00175 *dst = '\0';
00176 return buf;
00177 }
00178
00179
00180 CLASS_DESCRIPTOR(dbDate,
00181 (KEY(jday,INDEXED|HASHED),
00182 METHOD(year), METHOD(month), METHOD(day), METHOD(dayOfWeek)));
00183
00184 dbQueryExpression operator == (char const* field) {
00185 dbQueryExpression expr;
00186 expr = dbComponent(field,"jday"),"=",jday;
00187 return expr;
00188 }
00189 dbQueryExpression operator != (char const* field) {
00190 dbQueryExpression expr;
00191 expr = dbComponent(field,"jday"),"<>",jday;
00192 return expr;
00193 }
00194 dbQueryExpression operator < (char const* field) {
00195 dbQueryExpression expr;
00196 expr = dbComponent(field,"jday"),">",jday;
00197 return expr;
00198 }
00199 dbQueryExpression operator <= (char const* field) {
00200 dbQueryExpression expr;
00201 expr = dbComponent(field,"jday"),">=",jday;
00202 return expr;
00203 }
00204 dbQueryExpression operator > (char const* field) {
00205 dbQueryExpression expr;
00206 expr = dbComponent(field,"jday"),"<",jday;
00207 return expr;
00208 }
00209 dbQueryExpression operator >= (char const* field) {
00210 dbQueryExpression expr;
00211 expr = dbComponent(field,"jday"),"<=",jday;
00212 return expr;
00213 }
00214 friend dbQueryExpression between(char const* field, dbDate& from,
00215 dbDate& till)
00216 {
00217 dbQueryExpression expr;
00218 expr=dbComponent(field,"jday"),"between",from.jday,"and",till.jday;
00219 return expr;
00220 }
00221
00222 static dbQueryExpression ascent(char const* field) {
00223 dbQueryExpression expr;
00224 expr=dbComponent(field,"jday");
00225 return expr;
00226 }
00227 static dbQueryExpression descent(char const* field) {
00228 dbQueryExpression expr;
00229 expr=dbComponent(field,"jday"),"desc";
00230 return expr;
00231 }
00232 };
00233
00234 END_FASTDB_NAMESPACE
00235
00236 #endif