Winapi 如何将std::chrono::high_resolution_clock::now()转换为Windows文件时间(以及反向转换)

Winapi 如何将std::chrono::high_resolution_clock::now()转换为Windows文件时间(以及反向转换),winapi,c++11,visual-studio-2013,Winapi,C++11,Visual Studio 2013,有没有一种方法可以轻松地将std::chrono::high_resolution_clock::now()时间转换为Windows文件时间()(并返回)?我不知道怎么处理这个 非常感谢 您可以将时间点转换为时间,然后使用以下功能将其转换为文件时间 std::time_t t; t = to_time_t(std::chrono::high_resolution_clock::now()); 然后转换为FILETIME() #包括 #包括 void TimetToFileTime(time\u

有没有一种方法可以轻松地将std::chrono::high_resolution_clock::now()时间转换为Windows文件时间()(并返回)?我不知道怎么处理这个


非常感谢

您可以将
时间点
转换为
时间
,然后使用以下功能将其转换为文件时间

std::time_t t;
t = to_time_t(std::chrono::high_resolution_clock::now());
然后转换为FILETIME()

#包括
#包括
void TimetToFileTime(time\u t,LPFILETIME pft)
{
隆隆ll=Int32x32To64(t,10000000)+1164444736000000000;
pft->dwLowDateTime=(DWORD)ll;
pft->dwHighDateTime=ll>>32;
} 

另外,请记住,在windows上,高分辨率时钟作为不太高分辨率的系统时钟来实现,这似乎是正确的解决方案:

FILETIME fileTime = { 0 };
long long timePointTmp = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count() * 10 + 116444736000000000;
fileTime.dwLowDateTime = (unsigned long)timePointTmp;
fileTime.dwHighDateTime = timePointTmp >> 32;
FILETIME FILETIME={0};
long long timePointTmp=std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count()*10+1164444736000000000;
fileTime.dwLowDateTime=(无符号长)时间点TMP;
fileTime.dwHighDateTime=timePointTmp>>32;
如果您有(或可能有)100纳秒或更高精度的时间点:

FILETIME fileTime = {0};

// Filetime has a resolution of 100nanoseconds
typedef std::chrono::duration<int64_t, std::ratio_multiply<std::hecto, std::nano>> hundrednanoseconds;

// 100nanoseconds since unix epoch + epoch offset difference of filetime
long long timePointTmp =
    std::chrono::duration_cast<hundrednanoseconds>(tp.time_since_epoch()).count() 
    + 116444736000000000;

fileTime.dwLowDateTime = (unsigned long)timePointTmp;
fileTime.dwHighDateTime = timePointTmp >> 32;

return fileTime;
FILETIME FILETIME={0};
//Filetime的分辨率为100纳秒
typedef std::chrono::持续时间100纳秒;
//自unix历元起100纳秒+文件时间的历元偏移差
长时间点=
std::chrono::duration_cast(tp.time_-since_-epoch()).count()
+ 116444736000000000;
fileTime.dwLowDateTime=(无符号长)时间点TMP;
fileTime.dwHighDateTime=timePointTmp>>32;
返回文件时间;

谢谢,我找到了一个基于您的解决方案,该解决方案也可用于系统时钟,它比std::time\t更精确,因为std::time\t以秒为单位表示时间。VS 2015将修复高分辨率时钟:)考虑到此对流将失去所有亚秒分辨率(因此,高分辨率的时钟分辨率没有多大区别)
FILETIME fileTime = {0};

// Filetime has a resolution of 100nanoseconds
typedef std::chrono::duration<int64_t, std::ratio_multiply<std::hecto, std::nano>> hundrednanoseconds;

// 100nanoseconds since unix epoch + epoch offset difference of filetime
long long timePointTmp =
    std::chrono::duration_cast<hundrednanoseconds>(tp.time_since_epoch()).count() 
    + 116444736000000000;

fileTime.dwLowDateTime = (unsigned long)timePointTmp;
fileTime.dwHighDateTime = timePointTmp >> 32;

return fileTime;