【发布时间】:2014-02-20 08:06:36
【问题描述】:
我正在尝试使用this 获取自 1970 年 1 月 1 日以来的毫秒数。但是,当我尝试编译时,我得到了
"Error: cannot open source file 'sys/time.h'"
我正在使用 Visual Studio。
【问题讨论】:
我正在尝试使用this 获取自 1970 年 1 月 1 日以来的毫秒数。但是,当我尝试编译时,我得到了
"Error: cannot open source file 'sys/time.h'"
我正在使用 Visual Studio。
【问题讨论】:
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。工作流程如下:
GetSystemTime()获取系统时间。SystemTimeToFileTime转换为文件时间。我认为这正是您所需要的,但请记住,我对 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;
}
【讨论】:
GetSystemTimeAsFileTime() 替代 GetSystemTime() 和 SystemTimeToFileTime() 以使代码更加智能。
如果您使用的是 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;
}
【讨论】: