Получение текущего времени (в миллисекундах) из системных часов в Windows?



Как можно получить текущее время системных часов (в миллисекундах) на языке C++? Это специфическое приложение для windows.

788   6  

6 ответов:

Чтобы получить время, выраженное в формате UTC, используйте GetSystemTime в Win32 API.

SYSTEMTIME st;
GetSystemTime(&st);

SYSTEMTIME документально подтверждено наличие этих соответствующих членов:

WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;

Как shf301 услужливо указывает ниже, GetLocalTime (с тем же прототипом) даст время, скорректированное на текущий часовой пояс пользователя.

У вас есть несколько хороших ответов здесь, в зависимости от того, что вы ищете. Если вы ищете просто время суток, мой ответ-лучший подход - если вам нужно сплошные даты для арифметики, рассмотрим Alex. There'S a lot of ways to skin The time cat on Windows, и некоторые из них более точны, чем другие (и никто не упоминал QueryPerformanceCounter пока).

Самый простой (и самый прямой) способ-вызвать GetSystemTimeAsFileTime(), который возвращает FILETIME, структуру, которая хранит 64-битное число 100-наносекундных интервалов с полуночи 1 января 1601 года.

По крайней мере, во времена Windows NT 3.1, 3.51 и 4.01 API GetSystemTimeAsFileTime() был самым быстрым API пользовательского режима, способным извлекать текущее время. Это также дает преимущество (по сравнению с GetSystemTime () - > SystemTimeToFileTime ()) быть единственным вызовом API, который при нормальных обстоятельствах не может потерпеть неудачу.

Чтобы преобразовать FILETIME ft_now; в 64-разрядное целое число с именем ll_now, используйте следующее:
ll_now = (LONGLONG)ft_now.dwLowDateTime + ((LONGLONG)(ft_now.dwHighDateTime) << 32LL);

Затем вы можете разделить на количество 100-наносекундных интервалов в миллисекунде (10 000 из них), и у вас есть миллисекунды, начиная с эпохи Win32.

Чтобы перейти в эпоху Unix, вычитаем 116444736000000000LL, чтобы достичь 1 января 1970 года.

Вы упомянули о желании найти количество миллисекунд в текущем дне. Поскольку эпоха Win32 начинается в полночь, число миллисекунды, прошедшие до сих пор сегодня, могут быть вычислены из filetime с помощью операции модуля. В частности, поскольку существуют 24 hours/day * 60 minutes/hour * 60 seconds/minute * 1000 milliseconds/second = 86,400,000 milliseconds/day, Вы можете использовать модуль системного времени в миллисекундах modulus 86400000LL.

Для другого применения можно было бы не использовать модуль. Особенно если вы рассчитываете затраченное время, у вас могут возникнуть трудности из-за обхода в полночь. Эти трудности разрешимы, лучший пример, который я знаю, - это линия Линуса Торвальда в Ядро Linux, которое обрабатывает счетчик обернуть вокруг.

Имейте в виду, что системное время возвращается как время UTC (как в случае GetSystemTimeAsFileTime(), так и просто GetSystemTime()). Если вам требуется местное время, настроенное администратором, то вы можете использовать GetLocalTime().

Простой пример ответа Джеда выше:

const std::string currentDateTime() {

SYSTEMTIME st, lt;

GetSystemTime(&st);

char currentTime[84] = "";

sprintf(currentTime,"%d/%d/%d  %d:%d:%d %d",st.wDay,st.wMonth,st.wYear, st.wHour, st.wMinute, st.wSecond , st.wMilliseconds);

return string(currentTime); }

Используйте сначала GetSystemTime; затем, если вам это нужно, вы можете вызвать SystemTimeToFileTime на структуре SYSTEMTIME, которую заполняет для вас первый. A FILETIME-это 64-битное число 100-наносекундных интервалов, начиная с эпохи, и поэтому более подходит для арифметики; a SYSTEMTIME - это структура со всеми ожидаемыми полями (год, месяц, день, час и т. д., вплоть до миллисекунд). Если вы хотите знать, "сколько миллисекунд прошло с полуночи", например, вычитание двух структур FILETIME (один для текущего времени, один, полученный путем преобразования того же SYSTEMTIME после обнуления соответствующих полей) и деление на соответствующую степень десяти, вероятно, самый простой доступный подход.

В зависимости от потребностей вашего приложения существует шесть общих вариантов. Этастатья в журнале доктора Доббса даст вам всю информацию (и больше), необходимую для выбора лучшего.

В вашем конкретном случае из этой статьи:

GetSystemTime () возвращает текущий времени системе и создает Структура SYSTEMTIME, которая является состоит из ряда отдельных поля, включая год, месяц, день, часы, минуты, секунды и ... миллисекунды.

Вот некоторый код, который работает в Windows, который я использовал в открытом проекте Watcom C. Он должен работать в C++ он возвращает секунды (не миллисекунды), используя _dos_gettime или gettime

  double seconds(void)
  {
  #ifdef __WATCOMC__
  struct dostime_t t;
  _dos_gettime(&t);
  return ((double)t.hour * 3600 + (double)t.minute * 60 + (double)t.second + (double)t.hsecond * 0.01);
  #else
  struct time t;
  gettime(&t);
  return ((double)t.ti_hour * 3600 + (double)t.ti_min * 60 + (double)t.ti_sec + (double)t.ti_hund * 0.01);
  #endif
}

Comments

    Ничего не найдено.