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