从1970年1月1日起,C 设置了MS的Windows时间

C++ set Windows time from ms since 1/1/1970

本文关键字:MS Windows 时间 设置 1970年 1月 1日起      更新时间:2023-10-16

美好的一天。自1970年1月1日以来,我有时间在MS上,例如1487520625361

所以,我需要从中设置Windows时间。我找到了一个setLocalTime(& SystemTime)函数。因此,我需要解析MS的数量,或者可以更容易执行?

通常,您永远不想使用SYSTEMTIME结构(已经对显示并仅用于显示),而是使用FILETIME(以自1的时间表示为100 ns间隔的时间/1/1601),仅在计算结束时转换。

因此您需要:

  • 自1970年1月1日以来将您的MS转换为1/1/1601以来的100NS;
  • 将结果放入FILETIME;
  • FILETIME转换为SYSTEMTIME;
  • 呼叫SetLocalTime(如果原始时间戳在当地时间)或SetSystemTime(如果是在UTC中)。

最无聊的步骤是第一个步骤,因为您必须计算两个时期之间的差异。幸运的是,它已经在KB167296中完成,事实证明,我们之后的数字是1164444736000000000。

so:

void msecSinceEpochToFileTime(uint64_t msecSinceEpoch, FILETIME *ft) {
    uint64_t result = msecSinceEpoch * 10000; // ms => 100ns
    result += 116444736000000000ULL;    // Unix epoch in FILETIME
    ft->dwLowDateTime = (DWORD) result;
    ft->dwHighDateTime = result >> 32;
}

然后将FILETIME转换为SYSTEMTIME只是调用FileTimetoSystemime的问题。