Подтвердить что ты не робот

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

Как вы можете получить текущее время текущего времени системы (в миллисекундах) на С++? Это приложение для Windows.

4b9b3361

Ответ 1

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

SYSTEMTIME st;
GetSystemTime(&st);

SYSTEMTIME задокументирован как имеющий следующие соответствующие члены:

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

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

У вас есть несколько хороших ответов здесь, в зависимости от того, что вам нужно. Если вы ищете просто время суток, мой ответ - лучший подход - если вам нужны твердые даты для арифметики, подумайте об Алексах. Там много способов скинуть кошку времени на Windows, а некоторые из них более точны, чем другие (и никто не упомянул QueryPerformanceCounter еще.)

Ответ 2

Самый простой (и самый прямой) способ - вызвать 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 начинается с полуночи, количество миллисекунд, прошедших сегодня, можно вычислить из файла времени с помощью операции модуля. В частности, поскольку существует 24 hours/day * 60 minutes/hour * 60 seconds/minute * 1000 milliseconds/second = 86,400,000 milliseconds/day, вы можете использовать модуль системного времени в модуле миллисекунд 86400000LL.

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Пример ответа Jed выше:

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); }

Ответ 6

Вот какой код работает в Windows, который я использовал в проекте Open Watcom 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
}