/* ** Read the options specified in the ini file. ** */ void CMeasureTime::ReadOptions(CConfigParser& parser, const WCHAR* section) { CMeasure::ReadOptions(parser, section); m_Format = parser.ReadString(section, L"Format", L""); const WCHAR* timezone = parser.ReadString(section, L"TimeZone", L"local").c_str(); if (_wcsicmp(L"local", timezone) == 0) { SYSTEMTIME sysLocalTime, sysUTCTime; GetLocalTime(&sysLocalTime); GetSystemTime(&sysUTCTime); FILETIME ftLocalTime, ftUTCTime; SystemTimeToFileTime(&sysLocalTime, &ftLocalTime); SystemTimeToFileTime(&sysUTCTime, &ftUTCTime); LARGE_INTEGER largeInt1, largeInt2; largeInt1.HighPart = ftLocalTime.dwHighDateTime; largeInt1.LowPart = ftLocalTime.dwLowDateTime; largeInt2.HighPart = ftUTCTime.dwHighDateTime; largeInt2.LowPart = ftUTCTime.dwLowDateTime; m_DeltaTime.QuadPart = largeInt1.QuadPart - largeInt2.QuadPart; } else { double zone = wcstod(timezone, NULL); bool dst = 1 == parser.ReadInt(section, L"DaylightSavingTime", 1); struct tm* today; time_t now; time(&now); today = localtime(&now); if (dst && today->tm_isdst) { // Add DST TIME_ZONE_INFORMATION tzi; GetTimeZoneInformation(&tzi); m_DeltaTime.QuadPart = (LONGLONG)((zone * 3600) - tzi.DaylightBias * 60) * 10000000; } else { m_DeltaTime.QuadPart = (LONGLONG)(zone * 3600) * 10000000; } } if (!m_Initialized) { // Initialize m_Time to avoid causing EINVAL in TimeToString() until calling UpdateValue() FillCurrentTime(); } }
/* ** Updates the current time ** */ void CMeasureTime::UpdateValue() { FillCurrentTime(); if (!m_Format.empty()) { // If there is some date format, parse the value from it instead WCHAR* tmpSz = new WCHAR[MAX_LINE_LENGTH]; SYSTEMTIME sysToday; FILETIME ftToday; tmpSz[0] = 0; ftToday.dwHighDateTime = m_Time.HighPart; ftToday.dwLowDateTime = m_Time.LowPart; FileTimeToSystemTime(&ftToday, &sysToday); const WCHAR* format = m_Format.c_str(); if (_wcsicmp(L"locale-time", format) == 0) { GetTimeFormat(LOCALE_USER_DEFAULT, 0, &sysToday, NULL, tmpSz, MAX_LINE_LENGTH); } else if (_wcsicmp(L"locale-date", format) == 0) { GetDateFormat(LOCALE_USER_DEFAULT, 0, &sysToday, NULL, tmpSz, MAX_LINE_LENGTH); } else { struct tm today; today.tm_isdst = 0; today.tm_hour = sysToday.wHour; today.tm_mday = sysToday.wDay; today.tm_min = sysToday.wMinute; today.tm_mon = sysToday.wMonth - 1; today.tm_sec = sysToday.wSecond; today.tm_wday = sysToday.wDayOfWeek; today.tm_yday = GetYearDay(sysToday.wYear, sysToday.wMonth, sysToday.wDay); today.tm_year = sysToday.wYear - 1900; TimeToString(tmpSz, MAX_LINE_LENGTH, format, &today); } m_Value = wcstod(tmpSz, NULL); delete [] tmpSz; } else { m_Value = (double)(m_Time.QuadPart / 10000000); } }