Всем привет!
Пишу на С + winapi, нужно посчитать разницу между двумя датами — как это правильно сделать? Сейчас делаю так:
FILETIME ft;
SYSTEMTIME st;
GetLocalTime(&st);
SystemTimeToFileTime(&st, &ft);
ULARGE_INTEGER ui1;
ui1.HighPart = ft.dwHighDateTime;
ui1.LowPart = ft.dwLowDateTime;
st.wHour += 2;
FILETIME ft1;
SystemTimeToFileTime(&st, &ft1);
ULARGE_INTEGER ui2;
ui2.HighPart = ft1.dwHighDateTime;
ui2.LowPart = ft1.dwLowDateTime;
ft1.dwHighDateTime = ui2.HighPart - ui1.HighPart;
ft1.dwLowDateTime = ui2.LowPart - ui1.LowPart;
FileTimeToSystemTime(&ft1, &st);
Надеюсь в st в итоге получить разницу в 2 часа (т.к. st.wHour += 2), но получаю 1 месяц 1 день и 2 часа.. Как правильно это сделать?
Здравствуйте, Аноним, Вы писали:
А>А> ft1.dwHighDateTime = ui2.HighPart - ui1.HighPart;
А> ft1.dwLowDateTime = ui2.LowPart - ui1.LowPart;
А>
Неправильно вычитаешь.
Надо ui2.QuadPart — ui1.QuadPart.
А вообще в примере мешанина из разных форматов.
Даты у тебя в каком виде представлены?
Здравствуйте, rus blood, Вы писали:
RB>Неправильно вычитаешь.
RB>Надо ui2.QuadPart — ui1.QuadPart.
Результат не изменился..
RB>А вообще в примере мешанина из разных форматов.
RB>Даты у тебя в каком виде представлены?
Делаю, как написано в
мсдн
* Convert the SYSTEMTIME structure to a FILETIME structure.
* Copy the resulting FILETIME structure to a ULARGE_INTEGER structure.
* Use normal 64-bit arithmetic on the ULARGE_INTEGER value.
Вообще задача сохранить дату, а потом посчитать разницу в минутах с текущей датой. Как правильно это сделать?
А>Пишу на С + winapi, нужно посчитать разницу между двумя датами — как это правильно сделать? Сейчас делаю так:
А>А> FileTimeToSystemTime(&ft1, &st);
А>
А>Надеюсь в st в итоге получить разницу в 2 часа (т.к. st.wHour += 2), но получаю 1 месяц 1 день и 2 часа.. Как правильно это сделать?
Всё правильно. В полях wMonth и wDay не должен содержаться 0. А два часа от начала года — это и есть 2 часа ночи первого января.
Здравствуйте, Аноним, Вы писали:
А>Вообще задача сохранить дату, а потом посчитать разницу в минутах с текущей датой. Как правильно это сделать?
FILETIME ft1;
::GetSystemTimeAsFileTime(&ft1);
// сохранили дату ....
// прошло много лет...
DWORD GetNumberOfMinutesLeft()
{
FILETIME ft2;
::GetSystemTimeAsFileTime(&ft2);
ULARGE_INTEGER ul1;
ULARGE_INTEGER ul2;
ul1.HighPart = ft1.dwHighDateTime;
ul1.LowPart = ft1.dwLowDateTime;
ul2.HighPart = ft2.dwHighDateTime;
ul2.LowPart = ft2.dwLowDateTime;
return (ul2.QuadPart - ul1.QuadPart) / (60i64 * 10000000i64);
}