FILETIME хранит время в единицах по 100 наносекунд относительно собственной эпохи. Ручное объединение полей и деление на константы легко приводят к ошибкам со знаком или единицами измерения. В C++/WinRT можно преобразовать FILETIME в тип часов, а интервал выразить через std::chrono, что упрощает вычисления и снижает риск ошибок.
Пример: целые минуты с использованием C++/WinRT
Ниже приведён самостоятельный фрагмент кода для Windows/C++ с доступными заголовками C++/WinRT. Функция возвращает количество полных минут между сохранённой отметкой FILETIME и текущими системными часами; если сохранённая отметка находится в будущем относительно системного времени, функция возвращает 0.
#include <windows.h>
#include <winrt/base.h>
#include <chrono>
#include <cstdint>
std::int64_t elapsed_minutes(FILETIME changed)
{
auto earlier = winrt::clock::from_file_time(changed);
auto current = winrt::clock::now();
if (current < earlier) return 0;
return std::chrono::duration_cast<std::chrono::minutes>(
current - earlier).count();
}
В этом подходе разность вычисляется как текущее время минус сохранённое значение, а duration_cast явно задаёт единицы результата. Возвращаемый std::int64_t позволяет избежать преждевременного сужения результата до меньшего типа. Для измерения продолжительности внутри процесса предпочтительны монотонные часы, а не календарные отметки системного времени.
Альтернативы: Windows Implementation Library предоставляет помощники для работы с FILETIME, включая преобразования в целочисленные представления и константы длительностей. Приведённый пример демонстрирует основной подход с использованием std::chrono и C++/WinRT; сборка в конкретной конфигурации зависит от настроек проекта.