Разница между двумя переменными SYSTEMTIME - PullRequest
13 голосов
/ 02 января 2012

Я хочу получить разницу между двумя переменными SYSTEMTIME.Я видел, что кто-то задавал этот вопрос здесь раньше, но ему сказали преобразовать обе структуры SYSTEMTIME в FILETIME. Есть ли другой способ получить разницу?

SYSTEMTIME st;
GetSystemTime(&st);

--- здесь какой-то код ---

  SYSTEMTIME st2;
  GetSystemTime(&st2);

st-st2?

Ответы [ 3 ]

19 голосов
/ 15 октября 2013
SYSTEMTIME operator-(const SYSTEMTIME& pSr,const SYSTEMTIME& pSl)
{
    SYSTEMTIME t_res;
    FILETIME v_ftime;
    ULARGE_INTEGER v_ui;
    __int64 v_right,v_left,v_res;
    SystemTimeToFileTime(&pSr,&v_ftime);
    v_ui.LowPart=v_ftime.dwLowDateTime;
    v_ui.HighPart=v_ftime.dwHighDateTime;
    v_right=v_ui.QuadPart;

    SystemTimeToFileTime(&pSl,&v_ftime);
    v_ui.LowPart=v_ftime.dwLowDateTime;
    v_ui.HighPart=v_ftime.dwHighDateTime;
    v_left=v_ui.QuadPart;

    v_res=v_right-v_left;

    v_ui.QuadPart=v_res;
    v_ftime.dwLowDateTime=v_ui.LowPart;
    v_ftime.dwHighDateTime=v_ui.HighPart;
    FileTimeToSystemTime(&v_ftime,&t_res);
    return t_res;
}
7 голосов
/ 02 января 2012

В документации MSDN достаточно четко сказано: :

Не рекомендуется добавлять и вычитать значения из структуры SYSTEMTIME для получения относительного времени.Вместо этого вам следует

  • Преобразовать структуру SYSTEMTIME в структуру FILETIME.
  • Скопировать результирующую структуру FILETIME в структуру ULARGE_INTEGER.
  • Использовать обычную 64-битную арифметикуна значение ULARGE_INTEGER.

Почему бы не сделать именно это?

5 голосов
/ 02 января 2012

ft1 и ft2 - это файловые структуры

ULARGE_INTEGER ul1;
    ul1.LowPart = ft1.dwLowDateTime;
    ul1.HighPart = ft1.dwHighDateTime;

ULARGE_INTEGER ul2;
    ul2.LowPart = ft2.dwLowDateTime;
    ul2.HighPart = ft2.dwHighDateTime;


ul2.QuadPart -= ul1.QuadPart;

Разница в миллисекундах ...

ULARGE_INTEGER uliRetValue;
    uliRetValue.QuadPart = 0;


    uliRetValue = ul2;
    uliRetValue.QuadPart /= 10;
    uliRetValue.QuadPart /= 1000; // To Milliseconds
...