Новый ответ на старый вопрос.
Использование C ++ 11's <chrono>
плюс эта бесплатная библиотека с открытым исходным кодом:
https://github.com/HowardHinnant/date
Можно оченьлегко конвертировать эти временные метки в std::chrono::system_clock::time_point
, а также конвертировать эти временные метки в удобочитаемый формат в григорианском календаре:
#include "date.h"
#include <iostream>
std::chrono::system_clock::time_point
from_windows_filetime(long long t)
{
using namespace std::chrono;
using namespace date;
using wfs = duration<long long, std::ratio<1, 10'000'000>>;
return system_clock::time_point{floor<system_clock::duration>(wfs{t} -
(sys_days{1970_y/jan/1} - sys_days{1601_y/jan/1}))};
}
int
main()
{
using namespace date;
std::cout << from_windows_filetime(128166372003061629) << '\n';
std::cout << from_windows_filetime(128166372016382155) << '\n';
std::cout << from_windows_filetime(128166372026382245) << '\n';
}
Для меня это выводит:
2007-02-22 17:00:00.306162
2007-02-22 17:00:01.638215
2007-02-22 17:00:02.638224
В Windows,вы можете на самом деле пропустить floor
и получить последнюю десятичную цифру точности:
return system_clock::time_point{wfs{t} -
(sys_days{1970_y/jan/1} - sys_days{1601_y/jan/1})};
2007-02-22 17:00:00.3061629
2007-02-22 17:00:01.6382155
2007-02-22 17:00:02.6382245
При включенной оптимизации подвыражение (sys_days{1970_y/jan/1} - sys_days{1601_y/jan/1})
будет преобразовано во время компиляции в days{134774}
, что приведет квремя компиляции преобразуется в любые единицы измерения, которые требуются для полного выражения (секунды, 100 наносекунд и т. д.).Итог: это очень читабельно и очень эффективно.