C ++ извлекает количество мс с 01 января 1970 г .: не может открыть исходный файл sys / time.h

0

Я пытаюсь получить количество мс с 01 января 1970 года, используя это. Однако, когда я пытаюсь скомпилировать, я получаю

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

Я использую Visual Studio.

Теги:
winapi

2 ответа

4
Лучший ответ

Если вы используете 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;
}
4

Заголовок 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. Рабочий процесс выглядит следующим образом:

  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;
}
  • 0
    Это все еще не решило проблему, так как gettimeofday () теперь не распознается (я копирую дословно из решения по предоставленной мной ссылке).
  • 0
    Есть разница между решением вашей проблемы и ответом на ваш вопрос. В любом случае, я думаю, что последняя ссылка, которую я предлагаю, должна сработать.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню