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 услужливо указывает ниже,
У вас есть несколько хороших ответов здесь, в зависимости от того, что вы ищете. Если вы ищете просто время суток, мой ответ-лучший подход - если вам нужно сплошные даты для арифметики, рассмотрим Alex. There'S a lot of ways to skin The time cat on Windows, и некоторые из них более точны, чем другие (и никто не упоминалGetLocalTime(с тем же прототипом) даст время, скорректированное на текущий часовой пояс пользователя.QueryPerformanceCounterпока).
Самый простой (и самый прямой) способ-вызвать
По крайней мере, во времена Windows NT 3.1, 3.51 и 4.01 APIGetSystemTimeAsFileTime(), который возвращаетFILETIME, структуру, которая хранит 64-битное число 100-наносекундных интервалов с полуночи 1 января 1601 года.GetSystemTimeAsFileTime()был самым быстрым API пользовательского режима, способным извлекать текущее время. Это также дает преимущество (по сравнению с GetSystemTime () - > SystemTimeToFileTime ()) быть единственным вызовом API, который при нормальных обстоятельствах не может потерпеть неудачу.Чтобы преобразовать
Затем вы можете разделить на количество 100-наносекундных интервалов в миллисекунде (10 000 из них), и у вас есть миллисекунды, начиная с эпохи Win32.FILETIME ft_now;в 64-разрядное целое число с именемll_now, используйте следующее:ll_now = (LONGLONG)ft_now.dwLowDateTime + ((LONGLONG)(ft_now.dwHighDateTime) << 32LL);Чтобы перейти в эпоху Unix, вычитаем
Вы упомянули о желании найти количество миллисекунд в текущем дне. Поскольку эпоха Win32 начинается в полночь, число миллисекунды, прошедшие до сих пор сегодня, могут быть вычислены из filetime с помощью операции модуля. В частности, поскольку существуют116444736000000000LL, чтобы достичь 1 января 1970 года.24 hours/day * 60 minutes/hour * 60 seconds/minute * 1000 milliseconds/second = 86,400,000 milliseconds/day, Вы можете использовать модуль системного времени в миллисекундах modulus86400000LL.Для другого применения можно было бы не использовать модуль. Особенно если вы рассчитываете затраченное время, у вас могут возникнуть трудности из-за обхода в полночь. Эти трудности разрешимы, лучший пример, который я знаю, - это линия Линуса Торвальда в Ядро 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, которую заполняет для вас первый. AFILETIME-это 64-битное число 100-наносекундных интервалов, начиная с эпохи, и поэтому более подходит для арифметики; aSYSTEMTIME- это структура со всеми ожидаемыми полями (год, месяц, день, час и т. д., вплоть до миллисекунд). Если вы хотите знать, "сколько миллисекунд прошло с полуночи", например, вычитание двух структур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