TTm TSysTm::GetTmFromMSecs(const uint64& MSecs){ TUInt64 FileTmUnits(MSecs*uint64(10000)); SYSTEMTIME SysTm; FILETIME FileTm; FileTm.dwHighDateTime=FileTmUnits.GetMsVal(); FileTm.dwLowDateTime=FileTmUnits.GetLsVal(); SAssert(FileTimeToSystemTime(&FileTm, &SysTm)); return TTm(SysTm.wYear, SysTm.wMonth, SysTm.wDay, SysTm.wDayOfWeek, SysTm.wHour, SysTm.wMinute, SysTm.wSecond, SysTm.wMilliseconds); }
TTm TTm::GetTmFromWebLogDateTimeStr(const TStr& DateTimeStr, const char DateSepCh, const char TimeSepCh, const char MSecSepCh, const char DateTimeSepCh){ int DateTimeStrLen=DateTimeStr.Len(); // year TChA ChA; int ChN=0; while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=DateSepCh)){ ChA+=DateTimeStr[ChN]; ChN++;} TStr YearStr=ChA; // month ChA.Clr(); ChN++; while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=DateSepCh)){ ChA+=DateTimeStr[ChN]; ChN++;} TStr MonthStr=ChA; // day ChA.Clr(); ChN++; while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=DateTimeSepCh)){ ChA+=DateTimeStr[ChN]; ChN++;} TStr DayStr=ChA; // hour ChA.Clr(); ChN++; while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=TimeSepCh)){ ChA+=DateTimeStr[ChN]; ChN++;} TStr HourStr=ChA; // minute ChA.Clr(); ChN++; while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=TimeSepCh)){ ChA+=DateTimeStr[ChN]; ChN++;} TStr MinStr=ChA; // second ChA.Clr(); ChN++; while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=MSecSepCh)){ ChA+=DateTimeStr[ChN]; ChN++;} TStr SecStr=ChA; // mili-second ChA.Clr(); ChN++; while (ChN<DateTimeStrLen){ ChA+=DateTimeStr[ChN]; ChN++;} TStr MSecStr=ChA; // transform to numbers int YearN=YearStr.GetInt(-1); int MonthN=MonthStr.GetInt(-1); int DayN=DayStr.GetInt(-1); int HourN=HourStr.GetInt(0); int MinN=MinStr.GetInt(0); int SecN=SecStr.GetInt(0); int MSecN=MSecStr.GetInt(0); // construct time TTm Tm; if ((YearN!=-1)&&(MonthN!=-1)&&(DayN!=-1)){ Tm=TTm(YearN, MonthN, DayN, -1, HourN, MinN, SecN, MSecN); } // return time return Tm; }
TTm TTm::GetTmFromIdStr(const TStr& IdStr){ // normalize TChA IdChA=IdStr; if (IdChA.Len()==14){ IdChA.Ins(0, "0");} // check IAssert(IdChA.Len()==15); for (int ChN=0; ChN<IdChA.Len(); ChN++){ IAssert(TCh::IsNum(IdChA[ChN]));} // extract parts int YearN=2000+(TStr(IdChA[0])+TStr(IdChA[1])).GetInt(); int MonthN=(TStr(IdChA[2])+TStr(IdChA[3])).GetInt(); int DayN=(TStr(IdChA[4])+TStr(IdChA[5])).GetInt(); int HourN=(TStr(IdChA[6])+TStr(IdChA[7])).GetInt(); int MinN=(TStr(IdChA[8])+TStr(IdChA[9])).GetInt(); int SecN=(TStr(IdChA[10])+TStr(IdChA[11])).GetInt(); int MSecN=(TStr(IdChA[12])+TStr(IdChA[13])+TStr(IdChA[14])).GetInt(); TTm Tm=TTm(YearN, MonthN, DayN, -1, HourN, MinN, SecN, MSecN); return Tm; }
TTm TSysTm::GetLocTmFromUniTm(const TTm& Tm){ // get time-zone information TIME_ZONE_INFORMATION TzInf; GetTimeZoneInformation(&TzInf); // get system time SYSTEMTIME UniSysTm; UniSysTm.wYear=WORD(Tm.GetYear()); UniSysTm.wMonth=WORD(Tm.GetMonth()); UniSysTm.wDayOfWeek=WORD(Tm.GetDayOfWeek()); UniSysTm.wDay=WORD(Tm.GetDay()); UniSysTm.wHour=WORD(Tm.GetHour()); UniSysTm.wMinute=WORD(Tm.GetMin()); UniSysTm.wSecond=WORD(Tm.GetSec()); UniSysTm.wMilliseconds=WORD(Tm.GetMSec()); // convert system-time SYSTEMTIME LocSysTm; SystemTimeToTzSpecificLocalTime(&TzInf, &UniSysTm, &LocSysTm); // return local-time return TTm(LocSysTm.wYear, LocSysTm.wMonth, LocSysTm.wDay, LocSysTm.wDayOfWeek, LocSysTm.wHour, LocSysTm.wMinute, LocSysTm.wSecond, LocSysTm.wMilliseconds); }
TTm TSysTm::GetUniTmFromLocTm(const TTm& Tm){ // get time-zone information TIME_ZONE_INFORMATION TzInf; GetTimeZoneInformation(&TzInf); // get system time SYSTEMTIME LocSysTm; LocSysTm.wYear=WORD(Tm.GetYear()); LocSysTm.wMonth=WORD(Tm.GetMonth()); LocSysTm.wDayOfWeek=WORD(Tm.GetDayOfWeek()); LocSysTm.wDay=WORD(Tm.GetDay()); LocSysTm.wHour=WORD(Tm.GetHour()); LocSysTm.wMinute=WORD(Tm.GetMin()); LocSysTm.wSecond=WORD(Tm.GetSec()); LocSysTm.wMilliseconds=WORD(Tm.GetMSec()); // convert system-time SYSTEMTIME UniSysTm=LocSysTm; Fail; // BCB5.0 doesn't find TzSpecificLocalTimeToSystemTime //TzSpecificLocalTimeToSystemTime(&TzInf, &LocSysTm, &UniSysTm); // return system-time return TTm(UniSysTm.wYear, UniSysTm.wMonth, UniSysTm.wDay, UniSysTm.wDayOfWeek, UniSysTm.wHour, UniSysTm.wMinute, UniSysTm.wSecond, UniSysTm.wMilliseconds); }
TTm TSysTm::GetCurLocTm(){ SYSTEMTIME SysTm; GetLocalTime(&SysTm); return TTm(SysTm.wYear, SysTm.wMonth, SysTm.wDay, SysTm.wDayOfWeek, SysTm.wHour, SysTm.wMinute, SysTm.wSecond, SysTm.wMilliseconds); }
TTm TTm::GetTmFromDateTimeInt(const uint& DateTimeInt) { TTmDateTime DateTime; DateTime.Int = DateTimeInt; return TTm(DateTime.Bits.Year, DateTime.Bits.Month, DateTime.Bits.Day, -1, DateTime.Bits.Hour, DateTime.Bits.Min, 0, 0); }
TTm TTm::GetTmFromWebLogDateTimeStr(const TStr& DateTimeStr, const char DateSepCh, const char TimeSepCh, const char MSecSepCh){ int DateTimeStrLen=DateTimeStr.Len(); // year TChA ChA; int ChN=0; while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=DateSepCh)){ ChA+=DateTimeStr[ChN]; ChN++;} TStr YearStr=ChA; // month ChA.Clr(); ChN++; while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=DateSepCh)){ ChA+=DateTimeStr[ChN]; ChN++;} TStr MonthStr=ChA; // day ChA.Clr(); ChN++; while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=' ')){ ChA+=DateTimeStr[ChN]; ChN++;} TStr DayStr=ChA; // hour ChA.Clr(); ChN++; while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=TimeSepCh)){ ChA+=DateTimeStr[ChN]; ChN++;} TStr HourStr=ChA; // minute ChA.Clr(); ChN++; while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=TimeSepCh)){ ChA+=DateTimeStr[ChN]; ChN++;} TStr MinStr=ChA; // second ChA.Clr(); ChN++; while ((ChN<DateTimeStrLen)&&(DateTimeStr[ChN]!=MSecSepCh)){ ChA+=DateTimeStr[ChN]; ChN++;} TStr SecStr=ChA; // mili-second ChA.Clr(); ChN++; while (ChN<DateTimeStrLen){ ChA+=DateTimeStr[ChN]; ChN++;} TStr MSecStr=ChA; // transform to numbers int YearN=YearStr.GetInt(-1); int MonthN=MonthStr.GetInt(-1); int DayN=DayStr.GetInt(-1); int HourN=HourStr.GetInt(0); int MinN=MinStr.GetInt(0); int SecN=SecStr.GetInt(0); int MSecN=MSecStr.GetInt(0); // construct time /* //!!peter: convert month name to number and flip date/day (oracle: 10-FEB-05) if ((MonthN==-1)&&(isalpha(MonthStr.CStr()[0]))){ if ((MonthN=MonthParser.GetMonthN(MonthStr))!=-1){ int Y=DayN; DayN=YearN; YearN=Y<100?Y+2000:Y; } } */ TTm Tm; if ((YearN!=-1)&&(MonthN!=-1)&&(DayN!=-1)){ Tm=TTm(YearN, MonthN, DayN, -1, HourN, MinN, SecN, MSecN); } // return time return Tm; }
TTm TTm::GetTmFromDateTimeInt(const uint& DateTimeInt) { if (DateTimeInt == 0) { return TTm(); } return TTm(TSecTm(DateTimeInt)); }