SNAP Library , Developer Reference
2013-01-07 14:03:36
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
|
00001 00002 // Time-Names 00003 bool TTmInfo::InitP=false; 00004 TStrV TTmInfo::UsMonthNmV; 00005 TStrV TTmInfo::SiMonthNmV; 00006 TStrV TTmInfo::UsDayOfWeekNmV; 00007 TStrV TTmInfo::SiDayOfWeekNmV; 00008 00009 void TTmInfo::InitMonthNmV(){ 00010 // english 00011 UsMonthNmV.Add("jan"); UsMonthNmV.Add("feb"); UsMonthNmV.Add("mar"); 00012 UsMonthNmV.Add("apr"); UsMonthNmV.Add("may"); UsMonthNmV.Add("jun"); 00013 UsMonthNmV.Add("jul"); UsMonthNmV.Add("aug"); UsMonthNmV.Add("sep"); 00014 UsMonthNmV.Add("oct"); UsMonthNmV.Add("nov"); UsMonthNmV.Add("dec"); 00015 IAssert(UsMonthNmV.Len()==12); 00016 // slovene 00017 SiMonthNmV.Add("jan"); SiMonthNmV.Add("feb"); SiMonthNmV.Add("mar"); 00018 SiMonthNmV.Add("apr"); SiMonthNmV.Add("maj"); SiMonthNmV.Add("jun"); 00019 SiMonthNmV.Add("jul"); SiMonthNmV.Add("aug"); SiMonthNmV.Add("sep"); 00020 SiMonthNmV.Add("okt"); SiMonthNmV.Add("nov"); SiMonthNmV.Add("dec"); 00021 IAssert(SiMonthNmV.Len()==12); 00022 } 00023 00024 void TTmInfo::InitDayOfWeekNmV(){ 00025 // english 00026 UsDayOfWeekNmV.Add("sun"); UsDayOfWeekNmV.Add("mon"); 00027 UsDayOfWeekNmV.Add("tue"); UsDayOfWeekNmV.Add("wed"); 00028 UsDayOfWeekNmV.Add("thu"); UsDayOfWeekNmV.Add("fri"); 00029 UsDayOfWeekNmV.Add("sat"); 00030 IAssert(UsDayOfWeekNmV.Len()==7); 00031 // slovene 00032 SiDayOfWeekNmV.Add("ned"); SiDayOfWeekNmV.Add("pon"); 00033 SiDayOfWeekNmV.Add("tor"); SiDayOfWeekNmV.Add("sre"); 00034 SiDayOfWeekNmV.Add("cet"); SiDayOfWeekNmV.Add("pet"); 00035 SiDayOfWeekNmV.Add("sob"); 00036 IAssert(SiDayOfWeekNmV.Len()==7); 00037 } 00038 00039 int TTmInfo::GetMonthN(const TStr& MonthNm, const TLoc& Loc){ 00040 EnsureInit(); 00041 int MonthN=-1; 00042 switch (Loc){ 00043 case lUs: MonthN=UsMonthNmV.SearchForw(MonthNm.GetLc()); break; 00044 case lSi: MonthN=SiMonthNmV.SearchForw(MonthNm.GetLc()); break; 00045 default: Fail; 00046 } 00047 if (MonthN==-1){return -1;} else {return MonthN+1;} 00048 } 00049 00050 TStr TTmInfo::GetMonthNm(const int& MonthN, const TLoc& Loc){ 00051 EnsureInit(); 00052 IAssert((1<=MonthN)&&(MonthN<=12)); 00053 switch (Loc){ 00054 case lUs: return UsMonthNmV[MonthN-1]; 00055 case lSi: return SiMonthNmV[MonthN-1]; 00056 default: Fail; return TStr(); 00057 } 00058 } 00059 00060 int TTmInfo::GetDayOfWeekN(const TStr& DayOfWeekNm, const TLoc& Loc){ 00061 EnsureInit(); 00062 int DayOfWeekN=-1; 00063 switch (Loc){ 00064 case lUs: DayOfWeekN=UsDayOfWeekNmV.SearchForw(DayOfWeekNm.GetLc()); break; 00065 case lSi: DayOfWeekN=SiDayOfWeekNmV.SearchForw(DayOfWeekNm.GetLc()); break; 00066 default: Fail; 00067 } 00068 if (DayOfWeekN==-1){return -1;} else {return DayOfWeekN+1;} 00069 } 00070 00071 TStr TTmInfo::GetDayOfWeekNm(const int& DayOfWeekN, const TLoc& Loc){ 00072 EnsureInit(); 00073 IAssert((1<=DayOfWeekN)&&(DayOfWeekN<=7)); 00074 switch (Loc){ 00075 case lUs: return UsDayOfWeekNmV[DayOfWeekN-1]; 00076 case lSi: return SiDayOfWeekNmV[DayOfWeekN-1]; 00077 default: Fail; return TStr(); 00078 } 00079 } 00080 00081 TStr TTmInfo::GetHmFromMins(const int& Mins){ 00082 return TInt::GetStr(Mins/60, "%02d")+":"+TInt::GetStr(Mins%60, "%02d"); 00083 } 00084 00085 int TTmInfo::GetTmUnitSecs(const TTmUnit& TmUnit) { 00086 switch(TmUnit) { 00087 case tmuYear : return 365*24*3600; 00088 case tmuMonth : return 31*24*3600; 00089 case tmuWeek : return 7*24*3600; 00090 case tmuDay : return 24*3600; 00091 case tmu12Hour : return 12*3600; 00092 case tmu6Hour : return 6*3600; 00093 case tmu4Hour : return 4*3600; 00094 case tmu2Hour : return 2*3600; 00095 case tmu1Hour : return 1*3600; 00096 case tmu30Min : return 30*60; 00097 case tmu15Min : return 15*60; 00098 case tmu10Min : return 10*60; 00099 case tmu1Min : return 60; 00100 case tmu1Sec : return 1; 00101 case tmuNodes : Fail; 00102 case tmuEdges : Fail; 00103 default: Fail; 00104 } 00105 return -1; 00106 } 00107 00108 TStr TTmInfo::GetTmUnitStr(const TTmUnit& TmUnit) { 00109 switch(TmUnit) { 00110 case tmuYear : return "Year"; 00111 case tmuMonth : return "Month"; 00112 case tmuWeek : return "Week"; 00113 case tmuDay : return "Day"; 00114 case tmu12Hour : return "12 Hours"; 00115 case tmu6Hour : return "6 Hours"; 00116 case tmu4Hour : return "4 Hours"; 00117 case tmu2Hour : return "2 Hours"; 00118 case tmu1Hour : return "1 Hour"; 00119 case tmu30Min : return "30 Minutes"; 00120 case tmu15Min : return "15 Minutes"; 00121 case tmu10Min : return "10 Minutes"; 00122 case tmu1Min : return "Minute"; 00123 case tmu1Sec : return "Second"; 00124 case tmuNodes : return "Nodes"; 00125 case tmuEdges : return "Edges"; 00126 default: Fail; 00127 } 00128 return TStr::GetNullStr(); 00129 } 00130 00131 TStr TTmInfo::GetTmZoneDiffStr(const TStr& TmZoneStr){ 00132 if (TmZoneStr=="A"){/* Alpha Time Zone Military*/ return "+1000";} 00133 if (TmZoneStr=="ACDT"){/* Australian Central Daylight Time Australia */ return "+1030";} 00134 if (TmZoneStr=="ACST"){/* Australian Central Standard Time Australia */ return "+0930";} 00135 if (TmZoneStr=="ADT"){/* Atlantic Daylight Time North America */ return "-0300";} 00136 if (TmZoneStr=="AEDT"){/* Australian Eastern Daylight Time or Australian Eastern Summer Time Australia */ return "+1100";} 00137 if (TmZoneStr=="AEST"){/* Australian Eastern Standard Time Australia */ return "+1000";} 00138 if (TmZoneStr=="AKDT"){/* Alaska Daylight Time North America */ return "-0800";} 00139 if (TmZoneStr=="AKST"){/* Alaska Standard Time North America */ return "-0900";} 00140 if (TmZoneStr=="AST"){/* Atlantic Standard Time North America */ return "-0400";} 00141 if (TmZoneStr=="AWDT"){/* Australian Western Daylight Time Australia */ return "+0900";} 00142 if (TmZoneStr=="AWST"){/* Australian Western Standard Time Australia */ return "+0800";} 00143 if (TmZoneStr=="B"){/* Bravo Time Zone Military */ return "+0200";} 00144 if (TmZoneStr=="BST"){/* British Summer Time Europe */ return "+0100";} 00145 if (TmZoneStr=="C"){/* Charlie Time Zone Military */ return "+0300";} 00146 if (TmZoneStr=="CDT"){/* Central Daylight Time North America */ return "-0500";} 00147 if (TmZoneStr=="CDT"){/* Central Daylight Time Australia */ return "+1030";} 00148 if (TmZoneStr=="CEDT"){/* Central European Daylight Time Europe */ return "+0200";} 00149 if (TmZoneStr=="CEST"){/* Central European Summer Time Europe */ return "+0200";} 00150 if (TmZoneStr=="CET"){/* Central European Time Europe */ return "+0100";} 00151 if (TmZoneStr=="CST"){/* Central Standard Time North America */ return "-0600";} 00152 if (TmZoneStr=="CST"){/* Central Summer Time Australia */ return "+1030";} 00153 if (TmZoneStr=="CST"){/* Central Standard Time Australia */ return "+0930";} 00154 if (TmZoneStr=="CXT"){/* Christmas Island Time Australia */ return "+0700";} 00155 if (TmZoneStr=="D"){/* Delta Time Zone Military */ return "+0400";} 00156 if (TmZoneStr=="E"){/* Echo Time Zone Military */ return "+0500";} 00157 if (TmZoneStr=="EDT"){/* Eastern Daylight Time North America */ return "-0400";} 00158 if (TmZoneStr=="EDT"){/* Eastern Daylight Time Australia */ return "+1100";} 00159 if (TmZoneStr=="EEDT"){/* Eastern European Daylight Time Europe */ return "+0300";} 00160 if (TmZoneStr=="EEST"){/* Eastern European Summer Time Europe */ return "+0300";} 00161 if (TmZoneStr=="EET"){/* Eastern European Time Europe */ return "+0200";} 00162 if (TmZoneStr=="EST"){/* Eastern Standard Time North America */ return "-0500";} 00163 if (TmZoneStr=="EST"){/* Eastern Summer Time Australia */ return "+1100";} 00164 if (TmZoneStr=="EST"){/* Eastern Standard Time Australia */ return "+1000";} 00165 if (TmZoneStr=="F"){/* Foxtrot Time Zone Military */ return "+0600";} 00166 if (TmZoneStr=="G"){/* Golf Time Zone Military */ return "+0700";} 00167 if (TmZoneStr=="GMT"){/* Greenwich Mean Time Europe */ return "+0000";} 00168 if (TmZoneStr=="H"){/* Hotel Time Zone Military */ return "+0800";} 00169 if (TmZoneStr=="HAA"){/* Heure Avancee de l'Atlantique North America */ return "-0300";} 00170 if (TmZoneStr=="HAC"){/* Heure Avancee du Centre North America */ return "-0500";} 00171 if (TmZoneStr=="HADT"){/* Hawaii-Aleutian Daylight Time North America */ return "-0900";} 00172 if (TmZoneStr=="HAE"){/* Heure Avancee de l'Est North America */ return "-0400";} 00173 if (TmZoneStr=="HAP"){/* Heure Avancee du Pacifique North America */ return "-0700";} 00174 if (TmZoneStr=="HAR"){/* Heure Avancee des Rocheuses North America */ return "-0600";} 00175 if (TmZoneStr=="HAST"){/* Hawaii-Aleutian Standard Time North America */ return "-1000";} 00176 if (TmZoneStr=="HAT"){/* Heure Avancee de Terre-Neuve North America */ return "-0230";} 00177 if (TmZoneStr=="HAY"){/* Heure Avancee du Yukon North America */ return "-0800";} 00178 if (TmZoneStr=="HNA"){/* Heure Normale de l'Atlantique North America */ return "-0400";} 00179 if (TmZoneStr=="HNC"){/* Heure Normale du Centre North America */ return "-0600";} 00180 if (TmZoneStr=="HNE"){/* Heure Normale de l'Est North America */ return "-0500";} 00181 if (TmZoneStr=="HNP"){/* Heure Normale du Pacifique North America */ return "-0800";} 00182 if (TmZoneStr=="HNR"){/* Heure Normale des Rocheuses North America */ return "-0700";} 00183 if (TmZoneStr=="HNT"){/* Heure Normale de Terre-Neuve North America */ return "-0330";} 00184 if (TmZoneStr=="HNY"){/* Heure Normale du Yukon North America */ return "-0900";} 00185 if (TmZoneStr=="I"){/* India Time Zone Military */ return "+0900";} 00186 if (TmZoneStr=="IST"){/* Irish Summer Time Europe */ return "+0100";} 00187 if (TmZoneStr=="K"){/* Kilo Time Zone Military */ return "+1000";} 00188 if (TmZoneStr=="L"){/* Lima Time Zone Military */ return "+1100";} 00189 if (TmZoneStr=="M"){/* Mike Time Zone Military */ return "+1200";} 00190 if (TmZoneStr=="MDT"){/* Mountain Daylight Time North America */ return "-0600";} 00191 if (TmZoneStr=="MESZ"){/* Mitteleuropeische Sommerzeit Europe */ return "+0200";} 00192 if (TmZoneStr=="MEZ"){/* Mitteleuropeische Zeit Europe */ return "+0100";} 00193 if (TmZoneStr=="MSD"){/* Moscow Daylight Time Europe */ return "+0400";} 00194 if (TmZoneStr=="MSK"){/* Moscow Standard Time Europe */ return "+0300";} 00195 if (TmZoneStr=="MST"){/* Mountain Standard Time North America */ return "-0700";} 00196 if (TmZoneStr=="N"){/* November Time Zone Military */ return "-0100";} 00197 if (TmZoneStr=="NDT"){/* Newfoundland Daylight Time North America */ return "-0230";} 00198 if (TmZoneStr=="NFT"){/* Norfolk (Island) Time Australia */ return "+ 11:30";} 00199 if (TmZoneStr=="NST"){/* Newfoundland Standard Time North America */ return "-0330";} 00200 if (TmZoneStr=="O"){/* Oscar Time Zone Military */ return "-0200";} 00201 if (TmZoneStr=="P"){/* Papa Time Zone Military */ return "-0300";} 00202 if (TmZoneStr=="PDT"){/* Pacific Daylight Time North America */ return "-0700";} 00203 if (TmZoneStr=="PST"){/* Pacific Standard Time North America */ return "-0800";} 00204 if (TmZoneStr=="Q"){/* Quebec Time Zone Military */ return "-0400";} 00205 if (TmZoneStr=="R"){/* Romeo Time Zone Military */ return "-0500";} 00206 if (TmZoneStr=="S"){/* Sierra Time Zone Military */ return "-0600";} 00207 if (TmZoneStr=="T"){/* Tango Time Zone Military */ return "-0700";} 00208 if (TmZoneStr=="U"){/* Uniform Time Zone Military */ return "-0800";} 00209 if (TmZoneStr=="UTC"){/* Coordinated Universal Time Europe */ return "+0000";} 00210 if (TmZoneStr=="V"){/* Victor Time Zone Military */ return "-0900";} 00211 if (TmZoneStr=="W"){/* Whiskey Time Zone Military */ return "-1000";} 00212 if (TmZoneStr=="WDT"){/* Western Daylight Time Australia */ return "+0900";} 00213 if (TmZoneStr=="WEDT"){/* Western European Daylight Time Europe */ return "+0100";} 00214 if (TmZoneStr=="WEST"){/* Western European Summer Time Europe */ return "+0100";} 00215 if (TmZoneStr=="WET"){/* Western European Time Europe */ return "+0000";} 00216 if (TmZoneStr=="WST"){/* Western Summer Time Australia */ return "+0900";} 00217 if (TmZoneStr=="WST"){/* Western Standard Time Australia */ return "+0800";} 00218 if (TmZoneStr=="X"){/* X-ray Time Zone Military */ return "-1100";} 00219 if (TmZoneStr=="Y"){/* Yankee Time Zone Military */ return "-1200";} 00220 if (TmZoneStr=="Z"){/* Zulu Time Zone Military */ return "+0000";} 00221 return "-0000"; 00222 } 00223 00224 // day-of-week numbers 00225 const int TTmInfo::SunN=1; const int TTmInfo::MonN=2; 00226 const int TTmInfo::TueN=3; const int TTmInfo::WedN=4; 00227 const int TTmInfo::ThuN=5; const int TTmInfo::FriN=6; 00228 const int TTmInfo::SatN=7; 00229 00230 // month numbers 00231 const int TTmInfo::JanN=1; const int TTmInfo::FebN=2; 00232 const int TTmInfo::MarN=3; const int TTmInfo::AprN=4; 00233 const int TTmInfo::MayN=5; const int TTmInfo::JunN=6; 00234 const int TTmInfo::JulN=7; const int TTmInfo::AugN=8; 00235 const int TTmInfo::SepN=9; const int TTmInfo::OctN=10; 00236 const int TTmInfo::NovN=11; const int TTmInfo::DecN=12; 00237 00239 // Julian-Dates 00240 00241 /* public domain Julian Day Number functions 00242 ** 00243 ** Based on formulae originally posted by 00244 ** Tom Van Flandern / Washington, DC / metares@well.sf.ca.us 00245 ** in the UseNet newsgroup sci.astro. 00246 ** Reposted 14 May 1991 in FidoNet C Echo conference by 00247 ** Paul Schlyter (Stockholm) 00248 ** Minor corrections, added JDN to julian, and recast into C by 00249 ** Raymond Gardner Englewood, Colorado 00250 ** 00251 ** Synopsis: 00252 ** long ymd_to_jdn(int year, int month, int day, int julian_flag) 00253 ** void jdn_to_ymd(long jdn, int *year, int *month, int *day, 00254 ** int julian_flag) 00255 ** year is negative if BC 00256 ** if julian_flag is > 0, use Julian calendar 00257 ** if julian_flag is == 0, use Gregorian calendar 00258 ** if julian_flag is < 0, routines decide based on date 00259 ** 00260 ** These routines convert Gregorian and Julian calendar dates to and 00261 ** from Julian Day Numbers. Julian Day Numbers (JDN) are used by 00262 ** astronomers as a date/time measure independent of calendars and 00263 ** convenient for computing the elapsed time between dates. The JDN 00264 ** for any date/time is the number of days (including fractional 00265 ** days) elapsed since noon, 1 Jan 4713 BC. Julian Day Numbers were 00266 ** originated by Joseph Scaliger in 1582 and named after his father 00267 ** Julius, not after Julius Caesar. They are not related to the 00268 ** Julian calendar. 00269 ** 00270 ** For dates from 1 Jan 4713 BC thru 12 Dec Feb 32766 AD, ymd_to_jdn() 00271 ** will give the JDN for noon on that date. jdn_to_ymd() will compute 00272 ** the year, month, and day from the JDN. Years BC are given (and 00273 ** returned) as negative numbers. Note that there is no year 0 BC; 00274 ** the day before 1 Jan 1 AD is 31 Dec 1 BC. Note also that 1 BC, 00275 ** 5 BC, etc. are leap years. 00276 ** 00277 ** Pope Gregory XIII decreed that the Julian calendar would end on 00278 ** 4 Oct 1582 AD and that the next day would be 15 Oct 1582 in the 00279 ** Gregorian Calendar. The only other change is that centesimal 00280 ** years (years ending in 00) would no longer be leap years 00281 ** unless divisible by 400. Britain and its possessions and 00282 ** colonies continued to use the Julian calendar up until 2 Sep 00283 ** 1752, when the next day became 14 Sep 1752 in the Gregorian 00284 ** Calendar. These routines can be compiled to use either 00285 ** convention. By default, the British convention will be used. 00286 ** Simply #define PAPAL to use Pope Gregory's convention. 00287 ** 00288 ** Each routine takes, as its last argument, a flag to indicate 00289 ** whether to use the Julian or Gregorian calendar convention. If 00290 ** this flag is negative, the routines decide based on the date 00291 ** itself, using the changeover date described in the preceding 00292 ** paragraph. If the flag is zero, Gregorian conventions will be used, 00293 ** and if the flag is positive, Julian conventions will be used. 00294 */ 00295 00296 // Pope Gregory XIII's decree 00297 int TJulianDate::LastJulianDate=15821004; /* last day to use Julian calendar */ 00298 int TJulianDate::LastJulianDateN=2299160; /* jdn of same */ 00299 // British-American usage 00300 //int TJulianDate::LastJulianDate=17520902; /* last day to use Julian calendar */ 00301 //int TJulianDate::LastJulianDateN=2361221; /* jdn of same */ 00302 00303 int TJulianDate::GetJulianDateN(int d, int m, int y){ 00304 IAssert(y != 0); 00305 int julian = -1; 00306 long jdn; 00307 00308 if (julian < 0){ /* set Julian flag if auto set */ 00309 julian = (((y * 100L) + m) * 100 + d <= LastJulianDate);} 00310 00311 if (y < 0){ /* adjust BC year */ 00312 y++;} 00313 00314 if (julian){ 00315 jdn = 367L * y - 7 * (y + 5001L + (m - 9) / 7) / 4 00316 + 275 * m / 9 + d + 1729777L; 00317 } else { 00318 jdn = (long)(d - 32076) 00319 + 1461L * (y + 4800L + (m - 14) / 12) / 4 00320 + 367 * (m - 2 - (m - 14) / 12 * 12) / 12 00321 - 3 * ((y + 4900L + (m - 14) / 12) / 100) / 4 00322 + 1; /* correction by rdg */ 00323 } 00324 return (int) jdn; 00325 } 00326 00327 void TJulianDate::GetCalendarDate(int jdn, int& dd, int& mm, int& yy){ 00328 int julian = -1; 00329 00330 long x, z, m, d, y; 00331 long daysPer400Years = 146097L; 00332 long fudgedDaysPer4000Years = 1460970L + 31; 00333 00334 if (julian < 0){ /* set Julian flag if auto set */ 00335 julian = (jdn <= LastJulianDateN);} 00336 00337 x = jdn + 68569L; 00338 if (julian){ 00339 x+=38; 00340 daysPer400Years = 146100L; 00341 fudgedDaysPer4000Years = 1461000L + 1; 00342 } 00343 z = 4 * x / daysPer400Years; 00344 x = x - (daysPer400Years * z + 3) / 4; 00345 y = 4000 * (x + 1) / fudgedDaysPer4000Years; 00346 x = x - 1461 * y / 4 + 31; 00347 m = 80 * x / 2447; 00348 d = x - 2447 * m / 80; 00349 x = m / 11; 00350 m = m + 2 - 12 * x; 00351 y = 100 * (z - 49) + y + x; 00352 00353 yy = (int)y; 00354 mm = (int)m; 00355 dd = (int)d; 00356 00357 if (yy <= 0){ /* adjust BC years */ 00358 (yy)--;} 00359 } 00360 00362 // Seconds-Time 00363 bool TSecTm::GetTmSec(const int& YearN, const int& MonthN, const int& DayN, const int& HourN, const int& MinN, const int& SecN, uint& AbsSec) { 00364 AbsSec = 0; 00365 // tm_isdst: 00366 // - Positive if daylight saving time is in effect; 00367 // - 0 if daylight saving time is not in effect; 00368 // - negative if status of daylight saving time is unknown. 00369 // The C run-time library assumes the United States's rules for implementing 00370 // the calculation of Daylight Saving Time (DST). 00371 struct tm Tm; 00372 Tm.tm_year=YearN-1900; Tm.tm_mon=MonthN-1; Tm.tm_mday=DayN; 00373 Tm.tm_hour=HourN; Tm.tm_min=MinN; Tm.tm_sec=SecN; 00374 Tm.tm_wday=1; Tm.tm_yday=1; 00375 Tm.tm_isdst=-1; 00376 return TSecTm::GetTmSec(Tm, AbsSec); 00377 } 00378 00379 // implementation of mkgmtime (taken from the web) 00380 time_t TSecTm::MkGmTime(struct tm *t) { 00381 static const int m_to_d[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; 00382 short month, year; 00383 time_t result; 00384 month = t->tm_mon; 00385 year = t->tm_year + month / 12 + 1900; 00386 month %= 12; 00387 if (month < 0) { 00388 year -= 1; 00389 month += 12; } 00390 result = (year - 1970) * 365 + (year - 1969) / 4 + m_to_d[month]; 00391 result = (year - 1970) * 365 + m_to_d[month]; 00392 if (month <= 1) { year -= 1; } 00393 result += (year - 1968) / 4; 00394 result -= (year - 1900) / 100; 00395 result += (year - 1600) / 400; 00396 result += t->tm_mday; 00397 result -= 1; 00398 result *= 24; 00399 result += t->tm_hour; 00400 result *= 60; 00401 result += t->tm_min; 00402 result *= 60; 00403 result += t->tm_sec; 00404 return result; 00405 } 00406 00407 bool TSecTm::GetTmSec(struct tm& Tm, uint& AbsSec) { 00408 const time_t GmtTime = MkGmTime(&Tm); 00409 IAssertR(uint(GmtTime) < TUInt::Mx, 00410 TStr::Fmt("Time out of range: %d/%d/%d %02d:%02d:%02d", 00411 Tm.tm_year, Tm.tm_mon, Tm.tm_mday, Tm.tm_hour, Tm.tm_min, Tm.tm_sec).CStr()); 00412 AbsSec = uint(GmtTime); 00413 return GmtTime >= 0; 00414 } 00415 00416 bool TSecTm::GetTmStruct(const uint& AbsSec, struct tm& Tm) { 00417 const time_t TimeT = time_t(AbsSec); 00418 #if defined(GLib_MSC) 00419 return _gmtime64_s(&Tm, &TimeT) == 0; 00420 #elif defined(GLib_BCB) 00421 Tm=*gmtime(&TimeT); return true; 00422 #else 00423 return gmtime_r(&TimeT, &Tm) != NULL; 00424 #endif 00425 } 00426 00427 TSecTm::TSecTm(const int& YearN, const int& MonthN, const int& DayN, 00428 const int& HourN, const int& MinN, const int& SecN) : AbsSecs(TUInt::Mx){ 00429 GetTmSec(YearN, MonthN, DayN, HourN, MinN, SecN, AbsSecs.Val); 00430 } 00431 00432 TSecTm::TSecTm(const TTm& Tm): AbsSecs( 00433 TSecTm(Tm.GetYear(), Tm.GetMonth(), Tm.GetDay(), Tm.GetHour(), 00434 Tm.GetMin(), Tm.GetSec()).GetAbsSecs()) { } 00435 //int(TMath::Round(Tm.GetSec()*1000+Tm.GetMSec()))).GetAbsSecs()){} 00436 00437 TSecTm::TSecTm(const PXmlTok& XmlTok) { 00438 const int Year = XmlTok->GetIntArgVal("Year"); 00439 const int Month = XmlTok->GetIntArgVal("Month"); 00440 const int Day = XmlTok->GetIntArgVal("Day"); 00441 const int Hour = XmlTok->GetIntArgVal("Hour"); 00442 const int Min = XmlTok->GetIntArgVal("Min"); 00443 const int Sec = XmlTok->GetIntArgVal("Sec"); 00444 AbsSecs = TSecTm(Year, Month, Day, Hour, Min, Sec).GetAbsSecs(); 00445 } 00446 00447 PXmlTok TSecTm::GetXmlTok() const { 00448 PXmlTok NodeTok = TXmlTok::New("NodeTime"); 00449 NodeTok->AddArg("Year", GetYearN()); 00450 NodeTok->AddArg("Month", GetMonthN()); 00451 NodeTok->AddArg("Day", GetDayN()); 00452 NodeTok->AddArg("Hour", GetHourN()); 00453 NodeTok->AddArg("Min", GetMinN()); 00454 NodeTok->AddArg("Sec", GetSecN()); 00455 return NodeTok; 00456 } 00457 00458 TStr TSecTm::GetStr(const TLoc& Loc) const { 00459 if (IsDef()) { 00460 struct tm Tm; 00461 IAssert(GetTmStruct(AbsSecs(), Tm)); 00462 // Wed May 14 15:30:17 2003 00463 return TStr::Fmt("%s %s %d %02d:%02d:%02d %d", 00464 TTmInfo::GetDayOfWeekNm(Tm.tm_wday + 1, Loc).CStr(), 00465 TTmInfo::GetMonthNm(Tm.tm_mon + 1, Loc).CStr(), 00466 Tm.tm_mday, Tm.tm_hour, Tm.tm_min, Tm.tm_sec, Tm.tm_year+1900); 00467 } else { 00468 return "Undef"; 00469 } 00470 } 00471 00472 TStr TSecTm::GetStr(const TTmUnit& TmUnit) const { 00473 if (TmUnit == tmuYear) { 00474 return TInt::GetStr(GetYearN()); } 00475 else if (TmUnit == tmuMonth) { 00476 return TStr::Fmt("%04d-%02d", GetYearN(), GetMonthN()); } 00477 else if (TmUnit == tmuDay) { 00478 return TStr::Fmt("%04d-%02d-%02d", GetYearN(), GetMonthN(), GetDayN()); } 00479 else { 00480 return TStr::Fmt("%04d-%02d-%02d %02d:%02d:%02d", 00481 GetYearN(), GetMonthN(), GetDayN(), GetHourN(), GetMinN(), GetSecN()); 00482 } 00483 } 00484 00485 TStr TSecTm::GetDtStr(const TLoc& Loc) const { 00486 if (IsDef()){ 00487 struct tm Tm; 00488 IAssert(GetTmStruct(AbsSecs(), Tm)); 00489 return TStr::Fmt("%s %s %d %d", 00490 TTmInfo::GetDayOfWeekNm(Tm.tm_wday + 1, Loc).CStr(), 00491 TTmInfo::GetMonthNm(Tm.tm_mon + 1, Loc).CStr(), Tm.tm_year+1900); 00492 } else { 00493 return "Undef"; 00494 } 00495 } 00496 00497 TStr TSecTm::GetDtMdyStr() const { 00498 struct tm Tm; 00499 IAssert(GetTmStruct(AbsSecs(), Tm)); 00500 return TStr::Fmt("%02d/%02d%/%04d", Tm.tm_mon+1, Tm.tm_mday, Tm.tm_year+1900); 00501 } 00502 00503 TStr TSecTm::GetDtYmdStr() const { 00504 struct tm Tm; 00505 IAssert(GetTmStruct(AbsSecs(), Tm)); 00506 return TStr::Fmt("%04d-%02d-%02d", Tm.tm_year+1900, Tm.tm_mon+1, Tm.tm_mday); 00507 } 00508 00509 TStr TSecTm::GetYmdTmStr() const { 00510 struct tm Tm; 00511 IAssert(GetTmStruct(AbsSecs(), Tm)); 00512 return TStr::Fmt("%04d-%02d-%02d %02d:%02d:%02d", Tm.tm_year+1900, Tm.tm_mon+1, Tm.tm_mday, Tm.tm_hour, Tm.tm_min, Tm.tm_sec); 00513 } 00514 00515 00516 TStr TSecTm::GetTmStr() const { 00517 if (IsDef()){ 00518 struct tm Tm; 00519 IAssert(GetTmStruct(AbsSecs(), Tm)); 00520 return TStr::Fmt("%02d:%02d:%02d", Tm.tm_hour, Tm.tm_min, Tm.tm_sec); 00521 } else { 00522 return "Undef"; 00523 } 00524 } 00525 00526 TStr TSecTm::GetTmMinStr() const { 00527 if (IsDef()){ 00528 struct tm Tm; 00529 IAssert(GetTmStruct(AbsSecs(), Tm)); 00530 return TStr::Fmt("%02d:%02d", Tm.tm_min, Tm.tm_sec); 00531 } else { 00532 return "Undef"; 00533 } 00534 } 00535 00536 TStr TSecTm::GetDtTmSortStr() const { 00537 return 00538 TInt::GetStr(GetYearN(), "%04d")+"/"+ 00539 TInt::GetStr(GetMonthN(), "%02d")+"/"+ 00540 TInt::GetStr(GetDayN(), "%02d")+" "+ 00541 TInt::GetStr(GetHourN(), "%02d")+":"+ 00542 TInt::GetStr(GetMinN(), "%02d")+":"+ 00543 TInt::GetStr(GetSecN(), "%02d"); 00544 } 00545 00546 TStr TSecTm::GetDtTmSortFNmStr() const { 00547 return 00548 TInt::GetStr(GetYearN(), "%04d")+"-"+ 00549 TInt::GetStr(GetMonthN(), "%02d")+"-"+ 00550 TInt::GetStr(GetDayN(), "%02d")+"_"+ 00551 TInt::GetStr(GetHourN(), "%02d")+"-"+ 00552 TInt::GetStr(GetMinN(), "%02d")+"-"+ 00553 TInt::GetStr(GetSecN(), "%02d"); 00554 } 00555 00556 int TSecTm::GetYearN() const { 00557 struct tm Tm; 00558 IAssert(IsDef() && GetTmStruct(AbsSecs(), Tm)); 00559 return Tm.tm_year+1900; 00560 } 00561 00562 int TSecTm::GetMonthN() const { 00563 struct tm Tm; 00564 IAssert(IsDef() && GetTmStruct(AbsSecs(), Tm)); 00565 return Tm.tm_mon+1; 00566 } 00567 00568 TStr TSecTm::GetMonthNm(const TLoc& Loc) const { 00569 struct tm Tm; 00570 IAssert(IsDef() && GetTmStruct(AbsSecs(), Tm)); 00571 return TTmInfo::GetMonthNm(Tm.tm_mon+1, Loc); 00572 } 00573 00574 int TSecTm::GetDayN() const { 00575 struct tm Tm; 00576 IAssert(IsDef() && GetTmStruct(AbsSecs(), Tm)); 00577 return Tm.tm_mday; 00578 } 00579 00580 int TSecTm::GetDayOfWeekN() const { 00581 struct tm Tm; 00582 IAssert(IsDef() && GetTmStruct(AbsSecs(), Tm)); 00583 return Tm.tm_wday + 1; 00584 } 00585 00586 TStr TSecTm::GetDayOfWeekNm(const TLoc& Loc) const { 00587 struct tm Tm; 00588 IAssert(IsDef() && GetTmStruct(AbsSecs(), Tm)); 00589 return TTmInfo::GetDayOfWeekNm(Tm.tm_wday+1, Loc); 00590 } 00591 00592 int TSecTm::GetHourN() const { 00593 struct tm Tm; 00594 IAssert(IsDef() && GetTmStruct(AbsSecs(), Tm)); 00595 return Tm.tm_hour; 00596 } 00597 00598 int TSecTm::GetMinN() const { 00599 struct tm Tm; 00600 IAssert(IsDef() && GetTmStruct(AbsSecs(), Tm)); 00601 return Tm.tm_min; 00602 } 00603 00604 int TSecTm::GetSecN() const { 00605 struct tm Tm; 00606 IAssert(IsDef() && GetTmStruct(AbsSecs(), Tm)); 00607 return Tm.tm_sec; 00608 } 00609 00610 void TSecTm::GetComps(int& Year, int& Month, int& Day, int& Hour, int& Min, int& Sec) const { 00611 struct tm Tm; 00612 EAssert(IsDef() && GetTmStruct(AbsSecs(), Tm)); 00613 Year = Tm.tm_year+1900; 00614 Month = Tm.tm_mon+1; 00615 Day = Tm.tm_mday; 00616 Hour = Tm.tm_hour; 00617 Min = Tm.tm_min; 00618 Sec = Tm.tm_sec; 00619 } 00620 00621 TSecTm TSecTm::Round(const TTmUnit& TmUnit) const { 00622 if (TmUnit == tmu1Sec) { return *this; } 00623 struct tm Time; 00624 IAssert(IsDef() && GetTmStruct(AbsSecs(), Time)); 00625 switch (TmUnit) { 00626 case tmu1Min : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, Time.tm_hour, Time.tm_min, 0); 00627 case tmu10Min : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, Time.tm_hour, 10*(Time.tm_min/10), 0); 00628 case tmu15Min : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, Time.tm_hour, 15*(Time.tm_min/15), 0); 00629 case tmu30Min : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, Time.tm_hour, 30*(Time.tm_min/30), 0); 00630 case tmu1Hour : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, Time.tm_hour, 0, 0); 00631 case tmu2Hour : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, 2*(Time.tm_hour/2), 0, 0); 00632 case tmu4Hour : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, 4*(Time.tm_hour/4), 0, 0); 00633 case tmu6Hour : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, 6*(Time.tm_hour/6), 0, 0); 00634 case tmu12Hour : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, 12*(Time.tm_hour/12), 0, 0); 00635 case tmuDay : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, 0, 0, 0); 00636 case tmuMonth : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, 1, 0, 0, 0); 00637 case tmuYear : return TSecTm(Time.tm_year+1900, 1, 1, 0, 0, 0); 00638 case tmuWeek : { int dd=1, mm=1, yy=1; 00639 // week starts on Thursday, since 1.1.1970 is Thursday 00640 const int Day = TJulianDate::GetJulianDateN(Time.tm_mday, Time.tm_mon+1, 1900+Time.tm_year); 00641 TJulianDate::GetCalendarDate(3+7*(Day/7), dd, mm, yy); return TSecTm(yy, mm, dd, 0, 0, 0); } 00642 default : Fail; 00643 } 00644 return TSecTm(); 00645 } 00646 uint TSecTm::GetInUnits(const TTmUnit& TmUnit) const { 00647 static const int DayZero = TJulianDate::GetJulianDateN(1, 1, 1970); 00648 if (TmUnit == tmu1Sec) { return AbsSecs; } 00649 struct tm Time; 00650 IAssert(IsDef() && GetTmStruct(AbsSecs(), Time)); 00651 switch (TmUnit) { 00652 case tmu1Min : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, Time.tm_hour, Time.tm_min, 0).GetAbsSecs()/60; 00653 case tmu10Min : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, Time.tm_hour, 10*(Time.tm_min/10), 0).GetAbsSecs()/(10*60); 00654 case tmu15Min : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, Time.tm_hour, 15*(Time.tm_min/15), 0).GetAbsSecs()/(15*60); 00655 case tmu30Min : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, Time.tm_hour, 30*(Time.tm_min/30), 0).GetAbsSecs()/(30*60); 00656 case tmu1Hour : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, Time.tm_hour, 0, 0).GetAbsSecs()/3600; 00657 case tmu2Hour : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, 2*(Time.tm_hour/2), 0, 0).GetAbsSecs()/(2*3600); 00658 case tmu4Hour : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, 4*(Time.tm_hour/4), 0, 0).GetAbsSecs()/(4*3600); 00659 case tmu6Hour : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, 6*(Time.tm_hour/6), 0, 0).GetAbsSecs()/(6*3600); 00660 case tmu12Hour : return TSecTm(Time.tm_year+1900, Time.tm_mon+1, Time.tm_mday, 12*(Time.tm_hour/12), 0, 0).GetAbsSecs()/(12*3600); 00661 case tmuDay : return TJulianDate::GetJulianDateN(Time.tm_mday, Time.tm_mon+1, 1900+Time.tm_year) - DayZero; 00662 case tmuWeek : return (TJulianDate::GetJulianDateN(Time.tm_mday, Time.tm_mon+1, 1900+Time.tm_year)-DayZero)/7; 00663 case tmuMonth : return 12*(Time.tm_year-70)+Time.tm_mon+1; 00664 case tmuYear : return Time.tm_year+1900; 00665 default : Fail; 00666 } 00667 return TUInt::Mx; 00668 } 00669 00670 TStr TSecTm::GetDayPart() const { 00671 const int Hour = GetHourN(); 00672 if (0 <= Hour && Hour < 6) { return "Night"; } 00673 else if (6 <= Hour && Hour < 12) { return "Morning"; } 00674 else if (12 <= Hour && Hour < 18) { return "Afternoon"; } 00675 else if (18 <= Hour && Hour < 24) { return "Evening"; } 00676 return ""; 00677 } 00678 00679 uint TSecTm::GetDSecs(const TSecTm& SecTm1, const TSecTm& SecTm2){ 00680 IAssert(SecTm1.IsDef()&&SecTm2.IsDef()); 00681 const time_t Time1= time_t(SecTm1.AbsSecs()); 00682 const time_t Time2= time_t(SecTm2.AbsSecs()); 00683 return uint(difftime(Time2, Time1)); 00684 } 00685 00686 TSecTm TSecTm::GetZeroWeekTm(){ 00687 TSecTm ZeroWeekTm=GetZeroTm(); 00688 while (ZeroWeekTm.GetDayOfWeekN()!=TTmInfo::MonN){ 00689 ZeroWeekTm.AddDays(1);} 00690 return ZeroWeekTm; 00691 } 00692 00693 TSecTm TSecTm::GetCurTm(){ 00694 const time_t TmSec = time(NULL); 00695 struct tm LocTm; 00696 uint AbsSec = TUInt::Mx; 00697 #if defined(GLib_MSN) 00698 localtime_s(&LocTm, &TmSec); 00699 #elif defined(GLib_BCB) 00700 LocTm = *localtime(&TmSec); 00701 #else 00702 LocTm = *localtime(&TmSec); 00703 #endif 00704 IAssert(TSecTm::GetTmSec(LocTm, AbsSec)); 00705 return TSecTm(AbsSec); 00706 } 00707 00708 TSecTm TSecTm::GetDtTmFromHmsStr(const TStr& HmsStr){ 00709 int HmsStrLen=HmsStr.Len(); 00710 // hour 00711 TChA ChA; int ChN=0; 00712 while ((ChN<HmsStrLen)&&(HmsStr[ChN]!=':')){ChA+=HmsStr[ChN]; ChN++;} 00713 TStr HourStr=ChA; 00714 // minute 00715 ChA.Clr(); ChN++; 00716 while ((ChN<HmsStrLen)&&(HmsStr[ChN]!=':')){ChA+=HmsStr[ChN]; ChN++;} 00717 TStr MinStr=ChA; 00718 // second 00719 ChA.Clr(); ChN++; 00720 while (ChN<HmsStrLen){ChA+=HmsStr[ChN]; ChN++;} 00721 TStr SecStr=ChA; 00722 // transform to numbers 00723 int HourN=HourStr.GetInt(); 00724 int MinN=MinStr.GetInt(); 00725 int SecN=SecStr.GetInt(); 00726 // construct the time 00727 TSecTm Tm=TSecTm::GetZeroTm(); 00728 Tm.AddHours(HourN); 00729 Tm.AddMins(MinN); 00730 Tm.AddSecs(SecN); 00731 return Tm; 00732 } 00733 00734 TSecTm TSecTm::GetDtTmFromMdyStr(const TStr& MdyStr){ 00735 int MdyStrLen=MdyStr.Len(); 00736 // month 00737 TChA ChA; int ChN=0; 00738 while ((ChN<MdyStrLen)&&(MdyStr[ChN]!='/')){ 00739 ChA+=MdyStr[ChN]; ChN++;} 00740 TStr MonthStr=ChA; 00741 // day 00742 ChA.Clr(); ChN++; 00743 while ((ChN<MdyStrLen)&&(MdyStr[ChN]!='/')){ 00744 ChA+=MdyStr[ChN]; ChN++;} 00745 TStr DayStr=ChA; 00746 // year 00747 ChA.Clr(); ChN++; 00748 while (ChN<MdyStrLen){ 00749 ChA+=MdyStr[ChN]; ChN++;} 00750 TStr YearStr=ChA; 00751 // transform to numbers 00752 int MonthN=MonthStr.GetInt(); 00753 int DayN=DayStr.GetInt(); 00754 int YearN=YearStr.GetInt(); 00755 if (YearN<1000){ 00756 if (YearN<70){YearN+=2000;} else {YearN+=1900;}} 00757 // construct the date 00758 return GetDtTm(YearN, MonthN, DayN); 00759 } 00760 00761 // parse 28/03/03 and 28-MAY-03 formats 00762 TSecTm TSecTm::GetDtTmFromDmyStr(const TStr& DmyStr){ 00763 int DmyStrLen=DmyStr.Len(); 00764 // day 00765 TChA ChA; int ChN=0; 00766 while ((ChN<DmyStrLen)&&(DmyStr[ChN]!='/')&&(DmyStr[ChN]!='-')){ 00767 ChA+=DmyStr[ChN]; ChN++;} 00768 TStr DayStr=ChA; 00769 // month 00770 ChA.Clr(); ChN++; 00771 while ((ChN<DmyStrLen)&&(DmyStr[ChN]!='/')&&(DmyStr[ChN]!='-')){ 00772 ChA+=DmyStr[ChN]; ChN++;} 00773 TStr MonthStr=ChA; 00774 // year 00775 ChA.Clr(); ChN++; 00776 while (ChN<DmyStrLen){ 00777 ChA+=DmyStr[ChN]; ChN++;} 00778 TStr YearStr=ChA; 00779 // transform to numbers 00780 int DayN=DayStr.GetInt(-1); 00781 int MonthN=MonthStr.GetInt(-1); 00782 int YearN=YearStr.GetInt(-1); 00783 if (MonthN == -1){ 00784 MonthN = TTmInfo::GetMonthN(MonthStr.ToCap()); } 00785 if ((DayN==-1)||(MonthN==-1)||(YearN==-1)){ 00786 return TSecTm(); 00787 } else { 00788 if (YearN<1000){ 00789 if (YearN<70){YearN+=2000;} else {YearN+=1900;}} 00790 // construct the date 00791 return GetDtTm(YearN, MonthN, DayN); 00792 } 00793 return TSecTm(); 00794 } 00795 00796 TSecTm TSecTm::GetDtTmFromMdyHmsPmStr(const TStr& MdyHmsPmStr, 00797 const char& DateSepCh, const char& TimeSepCh){ 00798 int MdyHmsPmStrLen=MdyHmsPmStr.Len(); 00799 // month 00800 TChA ChA; int ChN=0; 00801 while ((ChN<MdyHmsPmStrLen)&&(MdyHmsPmStr[ChN]!=DateSepCh)){ 00802 ChA+=MdyHmsPmStr[ChN]; ChN++;} 00803 TStr MonthStr=ChA; 00804 // day 00805 ChA.Clr(); ChN++; 00806 while ((ChN<MdyHmsPmStrLen)&&(MdyHmsPmStr[ChN]!=DateSepCh)){ 00807 ChA+=MdyHmsPmStr[ChN]; ChN++;} 00808 TStr DayStr=ChA; 00809 // year 00810 ChA.Clr(); ChN++; 00811 while ((ChN<MdyHmsPmStrLen)&&(MdyHmsPmStr[ChN]!=' ')){ 00812 ChA+=MdyHmsPmStr[ChN]; ChN++;} 00813 TStr YearStr=ChA; 00814 // hour 00815 ChA.Clr(); ChN++; 00816 while ((ChN<MdyHmsPmStrLen)&&(MdyHmsPmStr[ChN]!=TimeSepCh)){ 00817 ChA+=MdyHmsPmStr[ChN]; ChN++;} 00818 TStr HourStr=ChA; 00819 // minute 00820 ChA.Clr(); ChN++; 00821 while ((ChN<MdyHmsPmStrLen)&&(MdyHmsPmStr[ChN]!=TimeSepCh)){ 00822 ChA+=MdyHmsPmStr[ChN]; ChN++;} 00823 TStr MinStr=ChA; 00824 // second 00825 ChA.Clr(); ChN++; 00826 while ((ChN<MdyHmsPmStrLen)&&(MdyHmsPmStr[ChN]!=' ')){ 00827 ChA+=MdyHmsPmStr[ChN]; ChN++;} 00828 TStr SecStr=ChA; 00829 // AM/PM 00830 ChA.Clr(); ChN++; 00831 while (ChN<MdyHmsPmStrLen){ 00832 ChA+=MdyHmsPmStr[ChN]; ChN++;} 00833 TStr AmPmStr=ChA; 00834 // transform to numbers 00835 int MonthN=MonthStr.GetInt(); 00836 int DayN=DayStr.GetInt(); 00837 int YearN=YearStr.GetInt(); 00838 int HourN; int MinN; int SecN; 00839 if (HourStr.IsInt()){ 00840 HourN=HourStr.GetInt(); 00841 MinN=MinStr.GetInt(); 00842 SecN=SecStr.GetInt(); 00843 if (AmPmStr=="AM"){} else if (AmPmStr=="PM"){HourN+=12;} else {Fail;} 00844 } else { 00845 HourN=0; MinN=0; SecN=0; 00846 } 00847 // construct the time 00848 TSecTm Tm=TSecTm::GetDtTm(YearN, MonthN, DayN); 00849 Tm.AddHours(HourN); 00850 Tm.AddMins(MinN); 00851 Tm.AddSecs(SecN); 00852 return Tm; 00853 } 00854 00855 TSecTm TSecTm::GetDtTmFromYmdHmsStr(const TStr& YmdHmsPmStr, 00856 const char& DateSepCh, const char& TimeSepCh){ 00857 int YmdHmsPmStrLen=YmdHmsPmStr.Len(); 00858 // year 00859 TChA ChA; int ChN=0; 00860 while ((ChN<YmdHmsPmStrLen)&&(YmdHmsPmStr[ChN]!=DateSepCh)){ 00861 ChA+=YmdHmsPmStr[ChN]; ChN++;} 00862 TStr YearStr=ChA; 00863 // month 00864 ChA.Clr(); ChN++; 00865 while ((ChN<YmdHmsPmStrLen)&&(YmdHmsPmStr[ChN]!=DateSepCh)){ 00866 ChA+=YmdHmsPmStr[ChN]; ChN++;} 00867 TStr MonthStr=ChA; 00868 // day 00869 ChA.Clr(); ChN++; 00870 while ((ChN<YmdHmsPmStrLen)&&(YmdHmsPmStr[ChN]!=' ')){ 00871 ChA+=YmdHmsPmStr[ChN]; ChN++;} 00872 TStr DayStr=ChA; 00873 // hour 00874 ChA.Clr(); ChN++; 00875 while ((ChN<YmdHmsPmStrLen)&&(YmdHmsPmStr[ChN]!=TimeSepCh)){ 00876 ChA+=YmdHmsPmStr[ChN]; ChN++;} 00877 TStr HourStr=ChA; 00878 // minute 00879 ChA.Clr(); ChN++; 00880 while ((ChN<YmdHmsPmStrLen)&&(YmdHmsPmStr[ChN]!=TimeSepCh)){ 00881 ChA+=YmdHmsPmStr[ChN]; ChN++;} 00882 TStr MinStr=ChA; 00883 // second 00884 ChA.Clr(); ChN++; 00885 while (ChN<YmdHmsPmStrLen){ 00886 ChA+=YmdHmsPmStr[ChN]; ChN++;} 00887 TStr SecStr=ChA; 00888 // transform to numbers 00889 int MonthN=MonthStr.GetInt(); 00890 int DayN=DayStr.GetInt(); 00891 int YearN=YearStr.GetInt(); 00892 int HourN; int MinN; int SecN; 00893 if (HourStr.IsInt()){ 00894 HourN=HourStr.GetInt(); 00895 MinN=MinStr.GetInt(); 00896 SecN=SecStr.GetInt(); 00897 } else { 00898 HourN=0; MinN=0; SecN=0; 00899 } 00900 // construct the time 00901 TSecTm Tm=TSecTm::GetDtTm(YearN, MonthN, DayN); 00902 Tm.AddHours(HourN); 00903 Tm.AddMins(MinN); 00904 Tm.AddSecs(SecN); 00905 return Tm; 00906 } 00907 00908 // Parse strings of the form 2006-08-28 14:11:16 or 14:11:16 08/28/2008 00909 // Non-numeric characters act as separators (there can be many consecutive separating characters) 00910 // Variables give indexes of the date fields 00911 TSecTm TSecTm::GetDtTmFromStr(const TChA& YmdHmsPmStr, const int& YearId, const int& MonId, 00912 const int& DayId, const int& HourId, const int& MinId, const int& SecId) { 00913 TChA Tmp = YmdHmsPmStr; 00914 TVec<char *> FldV; 00915 // get the sequences of numbers 00916 for (char *c = (char *) Tmp.CStr(); *c; c++) { 00917 if (TCh::IsNum(*c)) { 00918 FldV.Add(c); 00919 while (TCh::IsNum(*c)) { c++; } 00920 c--; 00921 } else { *c = 0; } 00922 } 00923 const int Y = atoi(FldV[YearId]); 00924 const int M = atoi(FldV[MonId]); 00925 const int D = atoi(FldV[DayId]); 00926 const int H = atoi(FldV[HourId]); 00927 const int m = atoi(FldV[MinId]); 00928 const int S = atoi(FldV[SecId]); 00929 IAssert(Y>0 && M>0 && D>0 && M<13 && D<32); 00930 IAssert(H>=0 && H<24 && m>=0 && m<60 && S>=0 && S<60); 00931 return TSecTm(Y,M,D,H,m,S); 00932 } 00933 00934 TSecTm TSecTm::GetDtTm(const int& YearN, const int& MonthN, const int& DayN){ 00935 uint AbsSecs; 00936 TSecTm::GetTmSec(YearN, MonthN, DayN, 0, 0, 0, AbsSecs); 00937 return TSecTm(AbsSecs); 00938 } 00939 00940 TSecTm TSecTm::GetDtTm(const TSecTm& Tm){ 00941 int DaySecs=Tm.GetHourN()*3600+Tm.GetMinN()*60+Tm.GetSecN(); 00942 TSecTm DtTm(Tm.AbsSecs-DaySecs); 00943 return DtTm; 00944 } 00945 00946 TSecTm TSecTm::LoadTxt(TILx& Lx){ 00947 return TSecTm(Lx.GetInt()); 00948 } 00949 00950 void TSecTm::SaveTxt(TOLx& Lx) const { 00951 IAssert(int(AbsSecs) < TInt::Mx); 00952 Lx.PutInt((int)AbsSecs); 00953 } 00954 00956 // Date-Time 00957 TStr TTm::GetStr(const bool& MSecP) const { 00958 TChA ChA; 00959 ChA+=TInt::GetStr(Year, "%04d"); ChA+='-'; 00960 // ChA+=GetMonthNm(); ChA+='-'; 00961 ChA+=TInt::GetStr(Month, "%02d"); ChA+='-'; 00962 ChA+=TInt::GetStr(Day, "%02d"); ChA+=' '; 00963 // ChA+=GetDayOfWeekNm(); ChA+=' '; 00964 ChA+=TInt::GetStr(Hour, "%02d"); ChA+=':'; 00965 ChA+=TInt::GetStr(Min, "%02d"); ChA+=':'; 00966 ChA+=TInt::GetStr(Sec, "%02d"); 00967 if (MSecP){ChA+='.'; ChA+=TInt::GetStr(MSec, "%04d");} 00968 return ChA; 00969 } 00970 00971 TStr TTm::GetYMDDashStr() const { 00972 TChA ChA; 00973 ChA+=TInt::GetStr(Year, "%04d"); 00974 ChA+='-'; ChA+=TInt::GetStr(Month, "%02d"); 00975 ChA+='-'; ChA+=TInt::GetStr(Day, "%02d"); 00976 return ChA; 00977 } 00978 00979 TStr TTm::GetHMSTColonDotStr(const bool& FullP, const bool& MSecP) const { 00980 TChA ChA; 00981 ChA+=TInt::GetStr(Hour, "%02d"); 00982 ChA+=':'; ChA+=TInt::GetStr(Min, "%02d"); 00983 if (FullP||((Sec!=0)||(MSec!=0))){ 00984 ChA+=':'; ChA+=TInt::GetStr(Sec, "%02d"); 00985 if ((MSecP)&&(FullP||(MSec!=0))){ 00986 ChA+='.'; ChA+=TInt::GetStr(MSec, "%d"); 00987 } 00988 } 00989 return ChA; 00990 } 00991 00992 TStr TTm::GetIdStr() const { 00993 TChA ChA; 00994 ChA+=TInt::GetStr(Year%100, "%02d"); 00995 ChA+=TInt::GetStr(Month, "%02d"); 00996 ChA+=TInt::GetStr(Day, "%02d"); 00997 ChA+=TInt::GetStr(Hour, "%02d"); 00998 ChA+=TInt::GetStr(Min, "%02d"); 00999 ChA+=TInt::GetStr(Sec, "%02d"); 01000 ChA+=TInt::GetStr(MSec, "%03d"); 01001 return ChA; 01002 } 01003 01004 01005 void TTm::AddTime(const int& Hours, 01006 const int& Mins, const int& Secs, const int& MSecs){ 01007 uint64 TmMSecs=TTm::GetMSecsFromTm(*this); 01008 TmMSecs+=(uint64(Hours)*uint64(3600)*uint64(1000)); 01009 TmMSecs+=(uint64(Mins)*uint64(60)*uint64(1000)); 01010 TmMSecs+=(uint64(Secs)*uint64(1000)); 01011 TmMSecs+=uint64(MSecs); 01012 *this=GetTmFromMSecs(TmMSecs); 01013 } 01014 01015 void TTm::SubTime(const int& Hours, 01016 const int& Mins, const int& Secs, const int& MSecs){ 01017 uint64 TmMSecs=TTm::GetMSecsFromTm(*this); 01018 TmMSecs-=(uint64(Hours)*uint64(3600)*uint64(1000)); 01019 TmMSecs-=(uint64(Mins)*uint64(60)*uint64(1000)); 01020 TmMSecs-=(uint64(Secs)*uint64(1000)); 01021 TmMSecs-=(uint64(MSecs)); 01022 *this=GetTmFromMSecs(TmMSecs); 01023 } 01024 01025 TTm TTm::GetCurUniTm(){ 01026 return TSysTm::GetCurUniTm(); 01027 } 01028 01029 TTm TTm::GetUniqueCurUniTm(){ 01030 static TTm LastUniqueTm=TSysTm::GetCurUniTm(); 01031 TTm CurUniqueTm=TSysTm::GetCurUniTm(); 01032 if (CurUniqueTm<LastUniqueTm){CurUniqueTm=LastUniqueTm;} 01033 if (CurUniqueTm==LastUniqueTm){CurUniqueTm.AddTime(0, 0, 0, 1);} 01034 LastUniqueTm=CurUniqueTm; 01035 return CurUniqueTm; 01036 } 01037 01038 TTm TTm::GetUniqueCurUniTm(const int& UniqueSpaces, const int& UniqueSpaceN){ 01039 static uint64 LastMUniqueTmMSecs=TSysTm::GetCurUniMSecs(); 01040 // uniqueness-space-parameters range-check 01041 Assert(UniqueSpaces>=1&&UniqueSpaceN>=0&&UniqueSpaceN<UniqueSpaces); 01042 // get current time 01043 uint64 CurUniqueTmMSecs=TSysTm::GetCurUniMSecs(); 01044 if (CurUniqueTmMSecs<LastMUniqueTmMSecs){CurUniqueTmMSecs=LastMUniqueTmMSecs;} 01045 // normalize to uniqueness-space-grid 01046 CurUniqueTmMSecs-=CurUniqueTmMSecs%UniqueSpaces; CurUniqueTmMSecs+=UniqueSpaceN; 01047 // get next free unique-time 01048 if (CurUniqueTmMSecs<=LastMUniqueTmMSecs){ 01049 CurUniqueTmMSecs+=UniqueSpaces; 01050 } 01051 // update last-time 01052 LastMUniqueTmMSecs=CurUniqueTmMSecs; 01053 return GetTmFromMSecs(CurUniqueTmMSecs); 01054 } 01055 01056 TTm TTm::GetCurLocTm(){ 01057 return TSysTm::GetCurLocTm(); 01058 } 01059 01060 uint64 TTm::GetCurUniMSecs(){ 01061 return TSysTm::GetCurUniMSecs(); 01062 } 01063 01064 uint64 TTm::GetCurLocMSecs(){ 01065 return TSysTm::GetCurLocMSecs(); 01066 } 01067 01068 uint64 TTm::GetMSecsFromTm(const TTm& Tm){ 01069 return TSysTm::GetMSecsFromTm(Tm); 01070 } 01071 01072 TTm TTm::GetTmFromMSecs(const uint64& MSecs){ 01073 return TSysTm::GetTmFromMSecs(MSecs); 01074 } 01075 01076 uint TTm::GetMSecsFromOsStart(){ 01077 return TSysTm::GetMSecsFromOsStart(); 01078 } 01079 01080 uint64 TTm::GetPerfTimerFq(){ 01081 return TSysTm::GetPerfTimerFq(); 01082 } 01083 01084 uint64 TTm::GetPerfTimerTicks(){ 01085 return TSysTm::GetPerfTimerTicks(); 01086 } 01087 01088 void TTm::GetDiff(const TTm& Tm1, const TTm& Tm2, int& Days, 01089 int& Hours, int& Mins, int& Secs, int& MSecs) { 01090 01091 const uint64 DiffMSecs = TTm::GetDiffMSecs(Tm1, Tm2); 01092 const uint64 DiffSecs = DiffMSecs / 1000; 01093 const uint64 DiffMins = DiffSecs / 60; 01094 const uint64 DiffHours = DiffMins / 60; 01095 01096 MSecs = DiffMSecs % 1000; 01097 Secs = DiffSecs % 60; 01098 Mins = DiffMins % 60; 01099 Hours = DiffHours % 24; 01100 Days = (int)DiffHours / 24; 01101 } 01102 01103 uint64 TTm::GetDiffMSecs(const TTm& Tm1, const TTm& Tm2){ 01104 uint64 Tm1MSecs=GetMSecsFromTm(Tm1); 01105 uint64 Tm2MSecs=GetMSecsFromTm(Tm2); 01106 if (Tm1MSecs>Tm2MSecs){ 01107 return Tm1MSecs-Tm2MSecs; 01108 } else { 01109 return Tm2MSecs-Tm1MSecs; 01110 } 01111 } 01112 01113 TTm TTm::GetLocTmFromUniTm(const TTm& Tm){ 01114 return TSysTm::GetLocTmFromUniTm(Tm); 01115 } 01116 01117 TTm TTm::GetUniTmFromLocTm(const TTm& Tm){ 01118 return TSysTm::GetUniTmFromLocTm(Tm); 01119 } 01120 01121 TTm TTm::GetTmFromWebLogTimeStr(const TStr& TimeStr, 01122 const char TimeSepCh, const char MSecSepCh){ 01123 int TimeStrLen=TimeStr.Len(); 01124 // year 01125 TChA ChA; int ChN=0; 01126 while ((ChN<TimeStrLen)&&(TimeStr[ChN]!=TimeSepCh)){ 01127 ChA+=TimeStr[ChN]; ChN++;} 01128 TStr HourStr=ChA; 01129 // minute 01130 ChA.Clr(); ChN++; 01131 while ((ChN<TimeStrLen)&&(TimeStr[ChN]!=TimeSepCh)){ 01132 ChA+=TimeStr[ChN]; ChN++;} 01133 TStr MinStr=ChA; 01134 // second 01135 ChA.Clr(); ChN++; 01136 while ((ChN<TimeStrLen)&&(TimeStr[ChN]!=MSecSepCh)){ 01137 ChA+=TimeStr[ChN]; ChN++;} 01138 TStr SecStr=ChA; 01139 // mili-second 01140 ChA.Clr(); ChN++; 01141 while (ChN<TimeStrLen){ 01142 ChA+=TimeStr[ChN]; ChN++;} 01143 TStr MSecStr=ChA; 01144 // transform to numbers 01145 int HourN=HourStr.GetInt(0); 01146 int MinN=MinStr.GetInt(0); 01147 int SecN=SecStr.GetInt(0); 01148 int MSecN=MSecStr.GetInt(0); 01149 // construct time 01150 TTm Tm(-1, -1, -1, -1, HourN, MinN, SecN, MSecN); 01151 // return time 01152 return Tm; 01153 } 01154 01155 TTm TTm::GetTmFromWebLogDateTimeStr(const TStr& DateTimeStr, 01156 const char DateSepCh, const char TimeSepCh, const char MSecSepCh, 01157 const char DateTimeSepCh){ 01158 int DateTimeStrLen=DateTimeStr.Len(); 01159 // year 01160 TChA ChA; int ChN=0; 01161 while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=DateSepCh)){ 01162 ChA+=DateTimeStr[ChN]; ChN++;} 01163 TStr YearStr=ChA; 01164 // month 01165 ChA.Clr(); ChN++; 01166 while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=DateSepCh)){ 01167 ChA+=DateTimeStr[ChN]; ChN++;} 01168 TStr MonthStr=ChA; 01169 // day 01170 ChA.Clr(); ChN++; 01171 while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=DateTimeSepCh)){ 01172 ChA+=DateTimeStr[ChN]; ChN++;} 01173 TStr DayStr=ChA; 01174 // hour 01175 ChA.Clr(); ChN++; 01176 while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=TimeSepCh)){ 01177 ChA+=DateTimeStr[ChN]; ChN++;} 01178 TStr HourStr=ChA; 01179 // minute 01180 ChA.Clr(); ChN++; 01181 while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=TimeSepCh)){ 01182 ChA+=DateTimeStr[ChN]; ChN++;} 01183 TStr MinStr=ChA; 01184 // second 01185 ChA.Clr(); ChN++; 01186 while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=MSecSepCh)){ 01187 ChA+=DateTimeStr[ChN]; ChN++;} 01188 TStr SecStr=ChA; 01189 // mili-second 01190 ChA.Clr(); ChN++; 01191 while (ChN<DateTimeStrLen){ 01192 ChA+=DateTimeStr[ChN]; ChN++;} 01193 TStr MSecStr=ChA; 01194 // transform to numbers 01195 int YearN=YearStr.GetInt(-1); 01196 int MonthN=MonthStr.GetInt(-1); 01197 int DayN=DayStr.GetInt(-1); 01198 int HourN=HourStr.GetInt(0); 01199 int MinN=MinStr.GetInt(0); 01200 int SecN=SecStr.GetInt(0); 01201 int MSecN=MSecStr.GetInt(0); 01202 // construct time 01203 TTm Tm; 01204 if ((YearN!=-1)&&(MonthN!=-1)&&(DayN!=-1)){ 01205 Tm=TTm(YearN, MonthN, DayN, -1, HourN, MinN, SecN, MSecN); 01206 } 01207 // return time 01208 return Tm; 01209 } 01210 01211 TTm TTm::GetTmFromIdStr(const TStr& IdStr){ 01212 // normalize 01213 TChA IdChA=IdStr; 01214 if (IdChA.Len()==14){ 01215 IdChA.Ins(0, "0");} 01216 // check 01217 IAssert(IdChA.Len()==15); 01218 for (int ChN=0; ChN<IdChA.Len(); ChN++){ 01219 IAssert(TCh::IsNum(IdChA[ChN]));} 01220 // extract parts 01221 int YearN=2000+(TStr(IdChA[0])+TStr(IdChA[1])).GetInt(); 01222 int MonthN=(TStr(IdChA[2])+TStr(IdChA[3])).GetInt(); 01223 int DayN=(TStr(IdChA[4])+TStr(IdChA[5])).GetInt(); 01224 int HourN=(TStr(IdChA[6])+TStr(IdChA[7])).GetInt(); 01225 int MinN=(TStr(IdChA[8])+TStr(IdChA[9])).GetInt(); 01226 int SecN=(TStr(IdChA[10])+TStr(IdChA[11])).GetInt(); 01227 int MSecN=(TStr(IdChA[12])+TStr(IdChA[13])+TStr(IdChA[14])).GetInt(); 01228 TTm Tm=TTm(YearN, MonthN, DayN, -1, HourN, MinN, SecN, MSecN); 01229 return Tm; 01230 } 01231 01232 uint TTm::GetDateTimeInt(const int& Year, const int& Month, 01233 const int& Day, const int& Hour, const int& Min, const int& Sec) { 01234 01235 return TSecTm(Year, Month, Day, Hour, Min, Sec).GetAbsSecs(); 01236 } 01237 01238 uint TTm::GetDateIntFromTm(const TTm& Tm) { 01239 return Tm.IsDef() ? GetDateTimeInt(Tm.GetYear(), Tm.GetMonth(), Tm.GetDay()) : 0; 01240 } 01241 01242 uint TTm::GetMonthIntFromTm(const TTm& Tm) { 01243 return Tm.IsDef() ? GetDateTimeInt(Tm.GetYear(), Tm.GetMonth()) : 0; 01244 } 01245 01246 uint TTm::GetYearIntFromTm(const TTm& Tm) { 01247 return Tm.IsDef() ? GetDateTimeInt(Tm.GetYear()) : 0; 01248 } 01249 01250 uint TTm::GetDateTimeIntFromTm(const TTm& Tm) { 01251 return Tm.IsDef() ? 01252 GetDateTimeInt(Tm.GetYear(), Tm.GetMonth(), 01253 Tm.GetDay(), Tm.GetHour(), Tm.GetMin(), Tm.GetSec()) : 0; 01254 } 01255 01256 TTm TTm::GetTmFromDateTimeInt(const uint& DateTimeInt) { 01257 if (DateTimeInt == 0) { return TTm(); } 01258 return TTm(TSecTm(DateTimeInt)); 01259 } 01260 01261 TSecTm TTm::GetSecTmFromDateTimeInt(const uint& DateTimeInt) { 01262 if (DateTimeInt == 0) { return TSecTm(); } 01263 return TSecTm(DateTimeInt); 01264 } 01265 01266 uint TTm::KeepMonthInDateTimeInt(const uint& DateTimeInt) { 01267 EAssert(DateTimeInt != 0); 01268 TSecTm SecTm(DateTimeInt); 01269 return GetDateTimeInt(2000, SecTm.GetMonthN(), 1); 01270 } 01271 01272 uint TTm::KeepDayInDateTimeInt(const uint& DateTimeInt) { 01273 EAssert(DateTimeInt != 0); 01274 TSecTm SecTm(DateTimeInt); 01275 return GetDateTimeInt(2000, 1, SecTm.GetDayN()); 01276 } 01277 01278 uint TTm::KeepHourInDateTimeInt(const uint& DateTimeInt) { 01279 EAssert(DateTimeInt != 0); 01280 TSecTm SecTm(DateTimeInt); 01281 return GetDateTimeInt(2000, 1, 1, SecTm.GetHourN()); 01282 } 01283 01285 // Time-Profiler - poor-man's profiler 01286 int TTmProfiler::AddTimer(const TStr& TimerNm) { 01287 MxNmLen = TInt::GetMx(MxNmLen, TimerNm.Len()); 01288 return TimerH.AddKey(TimerNm); 01289 } 01290 01291 void TTmProfiler::ResetAll() { 01292 int TimerId = GetTimerIdFFirst(); 01293 while (GetTimerIdFNext(TimerId)) { 01294 ResetTimer(TimerId); 01295 } 01296 } 01297 01298 double TTmProfiler::GetTimerSumSec() const { 01299 double Sum = 0.0; 01300 int TimerId = GetTimerIdFFirst(); 01301 while (GetTimerIdFNext(TimerId)) { 01302 Sum += GetTimerSec(TimerId); 01303 } 01304 return Sum; 01305 } 01306 01307 double TTmProfiler::GetTimerSec(const int& TimerId) const { 01308 return TimerH[TimerId].GetSec(); 01309 } 01310 01311 void TTmProfiler::PrintReport(const TStr& ProfileNm) const { 01312 const double TimerSumSec = GetTimerSumSec(); 01313 printf("-- %s --\n", ProfileNm.CStr()); 01314 printf("Sum: (%.2f sec):\n", TimerSumSec); 01315 int TimerId = GetTimerIdFFirst(); 01316 while (GetTimerIdFNext(TimerId)) { 01317 // get timer name 01318 TStr TimerNm = GetTimerNm(TimerId); 01319 TimerNm = TStr::GetSpaceStr(TimerNm.Len() - MxNmLen) + TimerNm; 01320 // get timer time and precentage 01321 if (TimerSumSec > 0.0) { 01322 const double TimerSec = GetTimerSec(TimerId); 01323 const double TimerPerc = TimerSec / TimerSumSec * 100.0; 01324 printf(" %s: %.2fs [%.2f%%]\n", TimerNm.CStr(), TimerSec, TimerPerc); 01325 } else { 01326 printf(" %s: -\n", TimerNm.CStr()); 01327 } 01328 } 01329 printf("--\n"); 01330 }