00001 #ifndef MASDATE_HH
00002 #define MASDATE_HH
00003 using std::string;
00004
00005 #define MX_FRMDATE 80
00006 #define MX_FRMTIME 80
00007 #define MX_FRMDATETIME (MX_FRMDATE+MX_FRMTIME)
00008
00010 class FBwDate
00011 {
00012 long dnum;
00013 static long reference;
00014 static int YEAR_OF_EPOCH;
00015 static int CENTURY_OF_EPOCH;
00016 static char *dayw[7];
00017 static char *adayw[7];
00018 static char *monname[12];
00019 static char *amonname[12];
00020 static const char *deffmt;
00021 const char *curfmt;
00022 long rmjdn(long Y, long M, long D);
00023 void invrmjdn(long &Y, long &M, long &D) const;
00024 void Init();
00025 protected:
00027
00034 virtual void ParseDate(const char *s,long &Y, long &M, long &D);
00036 int AdjustCentury(int Y);
00037 void SetDate(long dn)
00038 {
00039 dnum=dn;
00040 }
00041 public:
00043 FBwDate();
00045
00049 FBwDate(long jdn);
00051
00057 FBwDate(int y, int m, int d);
00059
00062 FBwDate(const char *s);
00064
00067 FBwDate(const string &s);
00069
00072 FBwDate(const tm &tim);
00074 FBwDate(const FBwDate &d)
00075 {
00076 dnum=d.dnum;
00077 }
00079 FBwDate &operator=(const FBwDate &d)
00080 {
00081 dnum=d.dnum;
00082 return *this;
00083 }
00085
00090 void IncMonth(int nMon);
00092 int operator <(const FBwDate &d) const
00093 {
00094 return dnum < d.dnum;
00095 }
00097 int operator <=(const FBwDate &d) const
00098 {
00099 return dnum <= d.dnum;
00100 }
00102 int operator==(const FBwDate &d) const
00103 {
00104 return dnum==d.dnum;
00105 }
00107 int operator!=(const FBwDate &d) const
00108 {
00109 return dnum!=d.dnum;
00110 }
00112 int operator==(const string &d) const ;
00114 int operator >(const FBwDate &d) const
00115 {
00116 return dnum>d.dnum;
00117 }
00119 int operator >=(const FBwDate &d) const
00120 {
00121 return dnum>=d.dnum;
00122 }
00124 FBwDate &operator++()
00125 {
00126 dnum++;
00127 return *this;
00128 }
00130
00133 FBwDate operator+(long v) const
00134 {
00135 return FBwDate(dnum+v);
00136 }
00138
00141 FBwDate &operator+=(long v)
00142 {
00143 dnum+=v;
00144 return *this;
00145 }
00147 FBwDate operator-(long v) const
00148 {
00149 return FBwDate(dnum-v);
00150 }
00152 FBwDate &operator-=(long v)
00153 {
00154 dnum-=v;
00155 return *this;
00156 }
00158 long operator-(const FBwDate &d) const
00159 {
00160 return dnum-d.dnum;
00161 }
00163
00168 string DateString(const char *format=0) const;
00170 long DateNum() const
00171 {
00172 return dnum;
00173 }
00175
00184 int dayofw() const;
00186 void CurrentDate();
00188 time_t MkDate(tm *tim) const;
00190 friend void SetDefaultDateFormat(const char *form);
00192 friend void SetEpoch(int Year, int Century);
00194 FBwDate FirstOfMonth() const;
00196 FBwDate LastOfMonth() const;
00198 FBwDate FirstOfWeek() const;
00200 FBwDate LastOfWeek() const;
00202 FBwDate FirstOfYear() const;
00204 FBwDate LastOfYear() const;
00206 int DayOfYear() const;
00208 string NameOfDay() const;
00210 string NameOfMonth() const;
00212 string AbNameOfDay() const;
00214 string AbNameOfMonth() const;
00216 void EncodeDate(int Year, int Month, int Day)
00217 {
00218 dnum=rmjdn(Year,Month,Day);
00219 }
00221 void DecodeDate( int &Y, int &M, int &D) const;
00222 virtual const char *GetFormat()
00223 {
00224 return curfmt;
00225 }
00226
00227 };
00228
00229 class FBwTime
00230 {
00231 long tnum;
00232 static const char *deffmt;
00233 const char *curfmt;
00234 static const char *ampmstr[2];
00235 static int scale;
00236 void Init();
00237 protected:
00238 virtual bool ParseTime(const char *s,int &hours, int &minutes, int &seconds, int &mimlis);
00239 void SetTime(long tn)
00240 {
00241 tnum=tn;
00242 }
00243 public:
00245 FBwTime();
00247
00250 FBwTime(long pTime);
00252
00257 FBwTime(const string &s);
00259
00264 FBwTime(const char *s);
00266
00269 FBwTime(int hours, int minutes, int seconds=0, int milisec=0);
00271
00274 FBwTime(const tm &tim);
00276 FBwTime(const FBwTime &pTime)
00277 {
00278 tnum=pTime.tnum;
00279 }
00281
00285 string TimeString(const char *format=0) const;
00287 friend void SetDefaultTimeFormat(const char *fmt);
00289 friend void SetTimeScale(int scale);
00291 int Seconds() const;
00293 int Minutes() const;
00295 int Hours() const;
00297 long TimeNum() const
00298 {
00299 return tnum;
00300 }
00301 void EncodeTime(int hours, int minutes, int seconds, int miliseconds=0);
00302 void DecodeTime(int &hours, int &minutes, int &seconds, int &miliseconds) const;
00304 FBwTime operator+(const FBwTime &t)
00305 {
00306 return FBwTime(tnum+t.tnum);
00307 }
00309 FBwTime operator+=(const FBwTime &t)
00310 {
00311 tnum+=t.tnum;
00312 }
00314 FBwTime operator-(const FBwTime &t)
00315 {
00316 return FBwTime(tnum-t.tnum);
00317 }
00319 FBwTime operator-=(const FBwTime &t)
00320 {
00321 tnum -= t.tnum;
00322 }
00324 void CurrentTime();
00326 time_t MkTime(tm *tim) const;
00328 int operator==(const FBwTime &t) const
00329 {
00330 return tnum==t.tnum;
00331 }
00333 int operator !=(const FBwTime &t) const
00334 {
00335 return tnum != t.tnum;
00336 }
00338 int operator <(const FBwTime &t) const
00339 {
00340 return tnum < t.tnum;
00341 }
00343 int operator <=(const FBwTime &t) const
00344 {
00345 return tnum <= t.tnum;
00346 }
00348 int operator >(const FBwTime &t) const
00349 {
00350 return tnum > t.tnum;
00351 }
00353 int operator >=(const FBwTime &t) const
00354 {
00355 return tnum >= t.tnum;
00356 }
00358
00362 int Normalize();
00363 };
00364
00365
00367
00370 class FBwDateTime : public FBwDate, public FBwTime
00371 {
00372 static const char *deffmt;
00373 const char *curfmt;
00374 protected:
00375 virtual bool ParseDateTime(const char *s,FBwDate &d,FBwTime &t) const;
00376 void Init();
00377 public:
00379 FBwDateTime() :
00380 FBwDate(),FBwTime()
00381 {
00382 Init();
00383 }
00385
00389 FBwDateTime(const FBwDate &d) :
00390 FBwDate(d),FBwTime()
00391 {
00392 Init();
00393 }
00395
00399 FBwDateTime(const FBwTime &t) :
00400 FBwDate(),FBwTime(t)
00401 {
00402 DateNormalize();
00403 Init();
00404 }
00406
00409 FBwDateTime(const FBwDate &d,const FBwTime &t) :
00410 FBwDate(d),FBwTime(t)
00411 {
00412 DateNormalize();
00413 Init();
00414 }
00416 FBwDateTime(long pdate, long ptime):
00417 FBwDate(pdate),FBwTime(ptime)
00418 {
00419 DateNormalize();
00420 Init();
00421 }
00422 FBwDateTime(const tm &tim);
00423 FBwDateTime(const string &s);
00425 FBwDate AsDate() const
00426 {
00427 return FBwDate(DateNum());
00428 }
00430 FBwTime AsTime() const
00431 {
00432 return FBwTime(TimeNum());
00433 }
00435 int operator==(const FBwDateTime &dt) const
00436 {
00437 return (DateNum()==dt.DateNum()) && (TimeNum()==dt.TimeNum());
00438 }
00440 int operator!=(const FBwDateTime &dt) const
00441 {
00442 return (DateNum()!=dt.DateNum()) || (TimeNum()==dt.TimeNum());
00443 }
00445 int operator<(const FBwDateTime &dt) const
00446 {
00447 return (DateNum()<dt.DateNum()) || (TimeNum()<dt.TimeNum() && DateNum()==dt.DateNum());
00448 }
00450 int operator<=(const FBwDateTime &dt) const
00451 {
00452 return (DateNum()<=dt.DateNum()) || (TimeNum()<=dt.TimeNum() && DateNum()==dt.DateNum());
00453 }
00455 int operator>(const FBwDateTime &dt) const
00456 {
00457 return (DateNum()>dt.DateNum()) || (TimeNum()>dt.TimeNum() && DateNum()==dt.DateNum());
00458 }
00460 int operator>=(const FBwDateTime &dt) const
00461 {
00462 return (DateNum()>=dt.DateNum()) || (TimeNum()>=dt.TimeNum() && DateNum()==dt.DateNum());
00463 }
00465 FBwDateTime operator+(const FBwDateTime &dt) const
00466 {
00467 FBwDateTime xdt(DateNum()+dt.DateNum(),TimeNum()+dt.TimeNum());
00468 xdt.Normalize();
00469 return xdt;
00470 }
00472 FBwDateTime operator-(const FBwDateTime &dt) const
00473 {
00474 FBwDateTime xdt(DateNum()-dt.DateNum(),TimeNum()-dt.TimeNum());
00475 xdt.DateNormalize();
00476 return xdt;
00477 }
00479 FBwDateTime operator+(const FBwDate &d) const
00480 {
00481 FBwDateTime xdt(DateNum()+d.DateNum(),TimeNum());
00482 return xdt;
00483 }
00485 FBwDateTime operator-(const FBwDate &d) const
00486 {
00487 FBwDateTime xdt(DateNum()+d.DateNum(),TimeNum());
00488 return xdt;
00489 }
00491 FBwDateTime operator+(const FBwTime &t) const
00492 {
00493 FBwDateTime xdt(DateNum(),TimeNum()+t.TimeNum());
00494 xdt.Normalize();
00495 return xdt;
00496 }
00498 FBwDateTime operator-(const FBwTime &t) const
00499 {
00500 FBwDateTime xdt(DateNum(),TimeNum()-t.TimeNum());
00501 xdt.DateNormalize();
00502 return xdt;
00503 }
00505 FBwDateTime operator+(int days) const
00506 {
00507 FBwDateTime xdt(DateNum()+days,TimeNum());
00508 return xdt;
00509 }
00511 FBwDateTime operator-(int days) const
00512 {
00513 FBwDateTime xdt(DateNum()-days,TimeNum());
00514 return xdt;
00515 }
00517 void DateNormalize()
00518 {
00519 SetDate(DateNum()+Normalize());
00520 }
00522
00526 string DateTimeString(const char *fmt=NULL) const;
00527 time_t MkDateTime(tm *tim) const;
00529 void CurrentDateTime()
00530 {
00531 CurrentDate();
00532 CurrentTime();
00533 }
00534 virtual const char *GetFormat()
00535 {
00536 return curfmt;
00537 }
00538 };
00539
00540 #endif