Если вы используете 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;
}
Заголовок sys/time.h
является заголовком POSIX и, как правило, не найден на компьютере под управлением Windows и, конечно же, не в Windows SDK. Для Visual Studio вам нужно включить time.h
а не sys/time.h
, как описано в документации.
Но функции в Visual Studio time.h
не дают вам миллисекундной точности. Существует не gettimeofday()
. Лучшее, что вы можете сделать, это время Unix в секундах. Теперь, миллисекунда точности Unix время в Windows было предметом этого вопроса: Как я могу получить UTCTime в миллисекундах с 1 января 1970 года на языке c. Однако принятый ответ ужасен и действительно должен быть удален.
После немного более сложного, я думаю, вы найдете то, что вам нужно здесь: Конвертировать Windows Filetime в Second 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;
}