【问题标题】:C++ retrieving the number of ms since jan 01 1970: cannot open source file sys/time.hC++ 检索自 1970 年 1 月 1 日以来的毫秒数:无法打开源文件 sys/time.h
【发布时间】:2014-02-20 08:06:36
【问题描述】:

我正在尝试使用this 获取自 1970 年 1 月 1 日以来的毫秒数。但是,当我尝试编译时,我得到了

"Error: cannot open source file 'sys/time.h'"

我正在使用 Visual Studio。

【问题讨论】:

    标签: c++ windows winapi


    【解决方案1】:

    sys/time.h 标头是 POSIX 标头,因此通常不会在 Windows 机器上找到,当然也不会在 Windows SDK 中找到。对于 Visual Studio,您需要包含 time.h 而不是 sys/time.h,如 documentation 中所述。

    但 Visual Studio time.h 中的函数不提供毫秒精度。没有gettimeofday()。你能做的最好的是以秒为单位的 Unix 时间。现在,Windows 上的毫秒精度 Unix 时间是这个问题的主题:How can i get UTCTime in millisecond since January 1, 1970 in c language。然而,接受的答案是可怕的,真的应该被删除。

    经过一番比较,我想你会在这里找到你需要的:Convert Windows Filetime to second in Unix/Linux。工作流程如下:

    1. 拨打GetSystemTime()获取系统时间。
    2. 致电SystemTimeToFileTime转换为文件时间。
    3. 使用上述链接中详述的转换将文件时间转换为 Unix 时间。

    我认为这正是您所需要的,但请记住,我对 C++ 不太熟练:

    #include <windows.h>
    
    long long GetUnixTime()
    {
        const long long WINDOWS_TICK = 10000000LL;
        const long long SEC_TO_UNIX_EPOCH = 11644473600LL;
    
        SYSTEMTIME st;
        GetSystemTime(&st);
    
        FILETIME ft;
        if (!SystemTimeToFileTime(&st, &ft))
            return -1;
    
        ULARGE_INTEGER uli;
        uli.LowPart = ft.dwLowDateTime;
        uli.HighPart = ft.dwHighDateTime;
        return uli.QuadPart / WINDOWS_TICK - SEC_TO_UNIX_EPOCH;
    }
    

    【讨论】:

    • 这仍然没有解决问题,因为 gettimeofday() 现在无法识别(我正在从我提供的链接中的解决方案中逐字复制)。
    • 解决你的问题和回答你的问题是有区别的。无论如何,我认为我提供的最后一个链接应该可以解决问题。
    • 不要附加 wMilliseconds!它们已经计入上面的代码中。
    • +1 我建议使用 GetSystemTimeAsFileTime() 替代 GetSystemTime()SystemTimeToFileTime() 以使代码更加智能。
    【解决方案2】:

    如果您使用的是 C++ 11,则可以使用 std::chrono

    #include <chrono>
    
    long long GetUnixTimeChrono()
    {
        auto timeSinceEpoch = std::chrono::system_clock::now().time_since_epoch();
        return std::chrono::duration_cast<std::chrono::milliseconds>(timeSinceEpoch).count();
    }
    

    否则,您可以这样做:

    #include <Windows.h>
    
    long long GetUnixTime()
    {
        SYSTEMTIME sysUnixEpoch;
        sysUnixEpoch.wYear = 1970;
        sysUnixEpoch.wMonth = 1;
        sysUnixEpoch.wDayOfWeek = 4;
        sysUnixEpoch.wDay = 1;
        sysUnixEpoch.wHour = 0;
        sysUnixEpoch.wMinute = 0;
        sysUnixEpoch.wSecond = 0;
        sysUnixEpoch.wMilliseconds = 0;
    
        FILETIME unixEpoch;
        SystemTimeToFileTime(&sysUnixEpoch, &unixEpoch);
    
        ULARGE_INTEGER unixEpochValue;
        unixEpochValue.HighPart = unixEpoch.dwHighDateTime;
        unixEpochValue.LowPart = unixEpoch.dwLowDateTime;
    
        FILETIME systemTime;
        GetSystemTimeAsFileTime(&systemTime);
    
        ULARGE_INTEGER systemTimeValue;
        systemTimeValue.HighPart = systemTime.dwHighDateTime;
        systemTimeValue.LowPart = systemTime.dwLowDateTime;
    
        long long diffHundredNanos = systemTimeValue.QuadPart - unixEpochValue.QuadPart;
        return diffHundredNanos / 10000;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-06
      • 2012-01-19
      • 2012-02-19
      • 2019-12-10
      • 2010-12-29
      • 1970-01-01
      • 2012-10-07
      • 2012-07-06
      相关资源
      最近更新 更多