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