00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <stdio.h>
00012 #include <stdlib.h>
00013 #include <time.h>
00014 #include <assert.h>
00015 #include "TUnixTime.h"
00016 #include "TDatime.h"
00017
00018
00019 ClassImp(TUnixTime)
00020
00021 TUnixTime::TUnixTime(UInt_t utime)
00022 {
00023 fUTime = utime;
00024 if (!fUTime) fUTime = time(0);
00025 }
00026
00027 TUnixTime::TUnixTime(Int_t date,Int_t time,int gmt)
00028 {
00029 if (gmt) SetGTime(date,time);
00030 else SetLTime(date,time);
00031 }
00032
00033 TUnixTime::TUnixTime(const TDatime &tdt,int gmt)
00034 {
00035 if (gmt) {SetGTime(tdt.GetDate(),tdt.GetTime());}
00036 else {SetLTime(tdt.GetDate(),tdt.GetTime());}
00037 }
00038
00039 void TUnixTime::SetGTime(const struct tm *tm_gmt)
00040 {
00041 int dif;
00042 time_t ugmt;
00043 struct tm tm_test;
00044 tm_test = *tm_gmt;
00045 tm_test.tm_isdst=-1;
00046 ugmt = mktime(&tm_test)-timezone;
00047 for (int iter=0;iter<24;iter++) {
00048 tm_test = *gmtime(&ugmt);
00049 tm_test.tm_isdst=-1;
00050 dif = tm_test.tm_year - tm_gmt->tm_year;
00051 if (dif) goto UPD;
00052 dif = tm_test.tm_mon - tm_gmt->tm_mon ;
00053 if (dif) goto UPD;
00054 dif = tm_test.tm_mday - tm_gmt->tm_mday;
00055 if (dif) goto UPD;
00056 dif = tm_test.tm_hour - tm_gmt->tm_hour;
00057 if (!dif) goto OK;
00058 UPD: if (dif<0) ugmt+=3600;
00059 else ugmt-=3600;
00060 }
00061 assert(0);
00062 OK: fUTime = ugmt;
00063
00064 }
00065
00066 void TUnixTime::SetLTime(const struct tm *lt)
00067 {
00068 struct tm ltt;
00069 ltt = *lt;
00070 fUTime = mktime(<t);
00071 }
00072
00073 static void DateTime2tm(struct tm *gt,Int_t idate, Int_t itime)
00074 {
00075 time_t ul = time(0);
00076 *gt = *localtime(&ul);
00077 gt->tm_isdst =-1;
00078 if (idate < 19000000) idate +=19000000;
00079 if (idate < 19500000) idate += 1000000;
00080 gt->tm_year= ((idate/10000)-1900);
00081 gt->tm_mon = ((idate/100)%100) - 1;
00082 gt->tm_mday= ((idate )%100);
00083 gt->tm_hour= itime/10000;
00084 gt->tm_min = (itime/100 )%100;
00085 gt->tm_sec = (itime )%100;
00086 }
00087
00088
00089 static void tm2DateTime(Int_t &idate, Int_t &itime,const struct tm *gt)
00090 {
00091 idate = (gt->tm_year+1900)*10000 + (gt->tm_mon+1)*100 + gt->tm_mday;
00092 itime = gt->tm_hour*10000 + gt->tm_min*100 + gt->tm_sec;
00093 }
00094
00095
00096 void TUnixTime::SetGTime(Int_t idate, Int_t itime)
00097 {
00098 struct tm gt;
00099 DateTime2tm(>,idate,itime);
00100 SetGTime(>);
00101
00102 }
00103
00104 void TUnixTime::SetLTime(Int_t idate, Int_t itime)
00105 {
00106 struct tm gt;
00107 DateTime2tm(>,idate,itime);
00108 SetLTime(>);
00109
00110 }
00111
00112 void TUnixTime::GetGTime(Int_t &idate, Int_t &itime)
00113 {
00114 struct tm gt;
00115 gt = *gmtime((time_t*)&fUTime);
00116 tm2DateTime(idate,itime,>);
00117
00118 }
00119
00120 void TUnixTime::GetLTime(Int_t &idate, Int_t &itime)
00121 {
00122 struct tm gt;
00123 gt = *localtime((time_t*)&fUTime);
00124 tm2DateTime(idate,itime,>);
00125
00126 }
00127
00128 TString TUnixTime::GetLString()
00129 {
00130 TString ts(ctime((time_t*)&fUTime));
00131 return ts;
00132 }
00133
00134 TString TUnixTime::GetGString()
00135 {
00136 TString ts(asctime(gmtime((time_t*)&fUTime)));
00137 return ts;
00138 }
00139
00140 void TUnixTime::SetLTime(const TDatime &loc)
00141 {
00142 SetLTime(loc.GetDate(), loc.GetTime());
00143 }
00144
00145 void TUnixTime::SetGTime(const TDatime &gmt)
00146 {
00147 SetGTime(gmt.GetDate(), gmt.GetTime());
00148 }
00149
00150 UInt_t TUnixTime::Convert(const TDatime &dt,int gmt)
00151 {
00152 TUnixTime ux;
00153 if (gmt) {ux.SetGTime(dt);}
00154 else {ux.SetLTime(dt);}
00155 return ux.GetUTime();
00156 }