Как вы можете получить текущее время текущего времени системы (в миллисекундах) на С++? Это приложение для Windows.
Получение текущего времени (в миллисекундах) из системных часов в Windows?
Ответ 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
}