winapi, разница во времени
От: Аноним  
Дата: 06.10.10 16:02
Оценка:
Всем привет!

Пишу на С + 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 часа.. Как правильно это сделать?
Re: winapi, разница во времени
От: rus blood Россия  
Дата: 06.10.10 16:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>    ft1.dwHighDateTime = ui2.HighPart - ui1.HighPart;
А>    ft1.dwLowDateTime = ui2.LowPart - ui1.LowPart;

А>


Неправильно вычитаешь.
Надо ui2.QuadPart — ui1.QuadPart.

А вообще в примере мешанина из разных форматов.
Даты у тебя в каком виде представлены?
Имею скафандр — готов путешествовать!
Re[2]: winapi, разница во времени
От: Аноним  
Дата: 07.10.10 07:42
Оценка:
Здравствуйте, 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.

Вообще задача сохранить дату, а потом посчитать разницу в минутах с текущей датой. Как правильно это сделать?
Re: winapi, разница во времени
От: McQwerty Россия  
Дата: 07.10.10 08:46
Оценка:
А>Пишу на С + winapi, нужно посчитать разницу между двумя датами — как это правильно сделать? Сейчас делаю так:

А>
А>    FileTimeToSystemTime(&ft1, &st);
А>


А>Надеюсь в st в итоге получить разницу в 2 часа (т.к. st.wHour += 2), но получаю 1 месяц 1 день и 2 часа.. Как правильно это сделать?


Всё правильно. В полях wMonth и wDay не должен содержаться 0. А два часа от начала года — это и есть 2 часа ночи первого января.
Re[3]: winapi, разница во времени
От: rus blood Россия  
Дата: 07.10.10 12:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вообще задача сохранить дату, а потом посчитать разницу в минутах с текущей датой. Как правильно это сделать?


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);
}
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.