Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Windows API:获取毫秒之间的微秒_C_Windows_Api_Date_Time - Fatal编程技术网

C Windows API:获取毫秒之间的微秒

C Windows API:获取毫秒之间的微秒,c,windows,api,date,time,C,Windows,Api,Date,Time,GetSystemTimePreciseSFileTime: 以尽可能高的精度检索当前系统日期和时间(正如您所注意到的,您不能使用SYSTEMTIME结构来执行此操作。您需要从返回的FILETIME结构中提取数据,并将其作为64位整数进行处理: FILETIME fTime; GetSystemTimePreciseAsFileTime(&fTime); uint64_t ftLo = uint64_t(fTime.dwLowDateTime); uint64_t ftHi = uint

GetSystemTimePreciseSFileTime:
以尽可能高的精度检索当前系统日期和时间(正如您所注意到的,您不能使用
SYSTEMTIME
结构来执行此操作。您需要从返回的
FILETIME
结构中提取数据,并将其作为64位整数进行处理:

FILETIME fTime;
GetSystemTimePreciseAsFileTime(&fTime);
uint64_t ftLo = uint64_t(fTime.dwLowDateTime);
uint64_t ftHi = uint64_t(fTime.dwHighDateTime);
uint64_t myTime = ftLo | (ftHi << 32uLL);
(这是基于自1601年1月1日以来的所有日子都有整数毫秒的假设,我认为这是一个合理的假设!)


注意:另一个选项是复制(或强制转换)<代码>文件时间< /C>结构>代码> OrjGeGeange,然后将该代码的<代码>四部< /C>元素分配给<代码> MyTime<代码>。这个“强>将也起作用,但是在标准C++中,写入一个联合的一部分,然后从另一个部分读取是正式的、未定义的行为。

< P>不能使用< COD”来实现这一点。e> SYSTEMTIME结构,正如您所注意到的。您需要从返回的
FILETIME
结构中提取数据,并将其作为64位整数进行处理:

FILETIME fTime;
GetSystemTimePreciseAsFileTime(&fTime);
uint64_t ftLo = uint64_t(fTime.dwLowDateTime);
uint64_t ftHi = uint64_t(fTime.dwHighDateTime);
uint64_t myTime = ftLo | (ftHi << 32uLL);
(这是基于自1601年1月1日以来的所有日子都有整数毫秒的假设,我认为这是一个合理的假设!)



注意:另一个选项是复制(或强制转换)<代码>文件时间< /C>结构>代码> OrjGeGeange,然后将该代码的<代码>四部< /C>元素分配给<代码> MyTime<代码>。这个“强>将也起作用,但在标准C++中,写入一个联合的一部分,然后从另一个部分读取是正式的、未定义的行为。最后,我甚至尝试了类似的方法,但找不到要屏蔽的正确位。你是如何确定(ftLo&0x0FFFFFFFF)是正确的屏蔽的?谢谢!哦,等一下。我不是问“从1601年1月1日起的100纳秒间隔数”我问的是给定毫秒之间的微秒数,以及微秒数之间的纳米数。从概念上讲,SYSTEMTIME结构应该拥有的下两个成员是什么样子的!你能解释一下你是如何确定掩码的吗:0x0FFFFFFFFFFFFPLUE not,结果似乎不正确,问题更新了源代码,micro是的,但是你可以通过删除“谈论”标志和面具来删除80%的答案:)好的!这就是我认为我们会结束的地方,我甚至尝试了类似的方法,但找不到正确的位来掩盖。您如何确定(ftLo&0x0FFFFFFFF)是正确的掩码?谢谢哦,等一下。我不是问“从1601年1月1日起的100纳秒间隔数”,我是问给定毫秒之间的微秒数,以及微秒数之间的纳秒数。从概念上讲,SYSTEMTIME结构的下两个成员应该是什么样子的!您能否解释一下您是如何确定掩码的:0x0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF。你需要特殊的硬件来确保时钟是准确的,通常是用GPS接收器来完成的。在使用GetSystemTimeAsFileTime()来测量运行时间的库中,此函数被用作替换。在原来的<代码> <代码>实现中,微软C++库是一个显著的违法者。如果分数部分>0.5,则<代码> > WMLISIENDS 值也会出现问题。但这并不能解释显示的输出列表中的所有“错误”。前面的注释的意思是,如果
FileTimeToSystemTime
函数就是这样工作的话。我不知道。(不过,更新的答案解决了这个问题!)@HansPassant说得不错!请注意,API函数名的名称中有“精确”一词,而不是“精确”。精确性和精确性之间的区别很重要!将返回值解释为绝对挂钟时间通常是不明智的。你需要特殊的硬件来确保时钟是准确的,通常是用GPS接收器来完成的。在使用GetSystemTimeAsFileTime()来测量运行时间的库中,此函数被用作替换。在原来的<代码> <代码>实现中,微软C++库是一个显著的违法者。如果分数部分>0.5,则<代码> > WMLISIENDS 值也会出现问题。但这并不能解释显示的输出列表中的所有“错误”。前面的注释的意思是,如果
FileTimeToSystemTime
函数就是这样工作的话。我不知道。(不过,更新的答案解决了这个问题!)@HansPassant说得不错!请注意,API函数名的名称中有“精确”一词,而不是“精确”。精确性和精确性之间的区别很重要!
int main()
{
    FILETIME ft = { 0 };
    SYSTEMTIME st = { 0 };

    UINT32 nsT = 0;
    UINT32 us = 0;
    UINT32 ns = 0;

    for (int i = 0; i < 32; i++)
    {

        GetSystemTimePreciseAsFileTime(&ft);

        FileTimeToSystemTime(&ft, &st);

        nsT = (ft.dwLowDateTime & 0x0FFFFFFFFLL) | (ft.dwHighDateTime << 32LL);

        us = (nsT % 10000LL) / 10LL;
        ns = (nsT % 10LL);

        wprintf(L"DT:[%u%02u%02u %02u:%02u:%02u:%03u:%03u:%u]\n",
            st.wYear, st.wMonth, st.wDay,
            st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, us, ns);
    }
}
DT:[20190921 12:48:51:152:735:4]
DT:[20190921 12:48:51:164:561:4]
DT:[20190921 12:48:51:169:126:3]
DT:[20190921 12:48:51:172:595:0]
DT:[20190921 12:48:51:173:428:7]
DT:[20190921 12:48:51:173:415:9]
DT:[20190921 12:48:51:177:446:2]
DT:[20190921 12:48:51:181:309:8]
DT:[20190921 12:48:51:182:386:7]
DT:[20190921 12:48:51:184:650:6]
DT:[20190921 12:48:51:184:740:6]
DT:[20190921 12:48:51:189:271:8]
DT:[20190921 12:48:51:190:471:4]
DT:[20190921 12:48:51:194:746:6]
DT:[20190921 12:48:51:197:049:5]
DT:[20190921 12:48:51:198:793:4]
DT:[20190921 12:48:51:200:823:4]
DT:[20190921 12:48:51:200:529:1]
DT:[20190921 12:48:51:202:606:3]
DT:[20190921 12:48:51:210:913:4]
DT:[20190921 12:48:51:214:764:6]
DT:[20190921 12:48:51:214:815:4]
DT:[20190921 12:48:51:219:079:4]
DT:[20190921 12:48:51:222:580:2]
DT:[20190921 12:48:51:223:959:5]
DT:[20190921 12:48:51:224:933:8]
DT:[20190921 12:48:51:225:844:7]
DT:[20190921 12:48:51:226:810:7]
DT:[20190921 12:48:51:228:811:1]
DT:[20190921 12:48:51:230:139:1]
DT:[20190921 12:48:51:253:539:1]
DT:[20190921 12:48:51:253:653:9]
DT:[20190921 12:48:51:173:428:7]
DT:[20190921 12:48:51:173:415:9]

DT:[20190921 12:48:51:200:823:4]
DT:[20190921 12:48:51:200:529:1]
DT:[20190921 13:05:01:228:534:1]
DT:[20190921 13:05:01:228:534:3]
DT:[20190921 13:05:01:228:534:3]
DT:[20190921 13:05:01:228:534:1]
DT:[20190921 13:05:01:228:534:3]
DT:[20190921 13:05:01:228:534:1]
DT:[20190921 13:05:01:228:534:3]
ms:[140][0x8C] != st.wMilliseconds:[177][0xB1]
ms:[284][0x11C] != st.wMilliseconds:[184][0xB8]
ms:[337][0x151] != st.wMilliseconds:[236][0xEC]
int main()
{
    WCHAR b[MAX][256] = { 0 };

    FILETIME ft = { 0 };
    SYSTEMTIME st = { 0 };

    UINT64 ftLo = 0;
    UINT64 ftHi = 0;
    UINT64 myTime = 0;
    UINT64 ms = 0;
    UINT64 us = 0;
    UINT64 ns = 0;

    for (int i = 0; i < MAX; i++)
    {
        GetSystemTimePreciseAsFileTime(&ft);

        FileTimeToSystemTime(&ft, &st);

        ftLo = ft.dwLowDateTime;
        ftHi = ft.dwHighDateTime;
        myTime = ftLo | (ftHi << 32uLL);

        ms = (myTime % 10000000uLL) / 10000uLL;
        us = (myTime % 10000uLL) / 10uLL;
        ns = (myTime % 10uLL);

        if (ms != st.wMilliseconds)
            wprintf(L"ms:[%llu][0x%llX] != st.wMilliseconds:[%u][0x%X]\n",
                    ms, ms, st.wMilliseconds, st.wMilliseconds);

        wprintf(L"%u%02u%02u %02u:%02u:%02u:%03llu:%03llu:%llu\n",
            st.wYear, st.wMonth, st.wDay,
            st.wHour, st.wMinute, st.wSecond,
            ms, us, ns);


    }

    return 0;
}
20190922 10:51:20:625:917:4
20190922 10:51:20:626:065:5
20190922 10:51:20:628:774:2
20190922 10:51:20:631:084:5
20190922 10:51:20:631:628:4
20190922 10:51:20:632:223:0
20190922 10:51:20:635:252:7
20190922 10:51:20:637:841:8
20190922 10:51:20:641:058:9
20190922 10:51:20:649:869:0
20190922 10:51:20:651:283:0
20190922 10:51:20:652:677:9
20190922 10:51:20:652:749:7
20190922 10:51:20:652:808:6
20190922 10:51:20:654:621:0
20190922 10:51:20:656:662:3
20190922 10:51:20:659:048:9
20190922 10:51:20:660:926:0
20190922 10:51:20:664:202:1
20190922 10:51:20:666:506:9
20190922 10:51:20:666:592:6
20190922 10:51:20:666:712:8
20190922 10:51:20:670:800:7
20190922 10:51:20:680:442:7
20190922 10:51:20:680:522:0
20190922 10:51:20:681:207:1
20190922 10:51:20:682:988:3
20190922 10:51:20:684:476:8
20190922 10:51:20:685:727:1
20190922 10:51:20:685:777:0
20190922 10:51:20:686:526:3
20190922 10:51:20:686:919:9
FILETIME fTime;
GetSystemTimePreciseAsFileTime(&fTime);
uint64_t ftLo = uint64_t(fTime.dwLowDateTime);
uint64_t ftHi = uint64_t(fTime.dwHighDateTime);
uint64_t myTime = ftLo | (ftHi << 32uLL);
uint64_t millis = (myTime % 10000000uLL) / 10000uLL;
uint64_t micros = (myTime % 10000uLL) / 10uLL;
uint64_t nanos = (myTime % 10uLL) * 100uLL; // Will have a resolution of only 100ns