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

Используйте единственный столбец [1] форматированного текста для хранения тегов и используйте способный механизм полнотекстового поиска для индексации этого. Еще Вы столкнетесь с масштабирующимися проблемами при попытке реализовать логические запросы.

при необходимости в деталях о тегах Вы имеете, можно или отслеживать его в инкрементно сохраняемой таблице или выполнить пакетное задание для извлечения информации.

[1] Некоторый RDBMS даже обеспечивает собственный тип массива, который мог бы еще лучше подойти для устройства хранения данных, не нуждаясь в шаге парсинга, но мог бы вызвать проблемы с полнотекстовым поиском.

34
задан oksayt 25 June 2012 в 06:33
поделиться

4 ответа

Чтобы получить время, выраженное в формате 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 (с тем же прототипом) даст время, скорректированное с учетом текущего часового пояса пользователя.

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

40
ответ дан 27 November 2019 в 16:06
поделиться

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

3
ответ дан 27 November 2019 в 16:06
поделиться

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

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

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

2
ответ дан 27 November 2019 в 16:06
поделиться

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

По крайней мере, во времена Windows NT 3.1, 3.51 и 4.01, GetSystemTimeAsFileTime () API был самым быстрым 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 часа / день * 60 минут / час * 60 секунд / минута * 1000 миллисекунд / секунда = 86400, 000 миллисекунд / день , вы можете использовать модуль системного времени в миллисекундах по модулю 86400000LL .

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

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

вы можете использовать модуль системного времени в миллисекундах. Модуль 86400000LL .

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

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

вы можете использовать модуль системного времени в миллисекундах. Модуль 86400000LL .

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

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

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

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

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

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

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

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

51
ответ дан 27 November 2019 в 16:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: