В Windows основой всего времени является функция с именем GetSystemTimeAsFiletime
.
- Возвращает структуру, способную удерживать время с разрешением 100 нс.
- Хранится в UTC
Структура FILETIME
записывает количество интервалов в 100 нс с 1 января 1600 года; это означает, что его разрешение ограничено 100 нс.
Это формирует нашу первую функцию:
64-битное число тиков в 100 нс с 1 января 1600 года несколько громоздко. Windows предоставляет удобную вспомогательную функцию FileTimeToSystemTime
, которая может декодировать это 64-разрядное целое число в полезные части:
record SYSTEMTIME {
wYear: Word;
wMonth: Word;
wDayOfWeek: Word;
wDay: Word;
wHour: Word;
wMinute: Word;
wSecond: Word;
wMilliseconds: Word;
}
Обратите внимание, что SYSTEMTIME
имеет встроенное ограничение разрешения 1ms
Теперь у нас есть путь от FILETIME
до SYSTEMTIME
:
Мы могли бы написать функцию для получения текущего системного времени в виде SYSTEIMTIME
структуры:
SYSTEMTIME GetSystemTime()
{
//Get the current system time utc in it's native 100ns FILETIME structure
FILETIME ftNow;
GetSytemTimeAsFileTime(ref ft);
//Decode the 100ns intervals into a 1ms resolution SYSTEMTIME for us
SYSTEMTIME stNow;
FileTimeToSystemTime(ref stNow);
return stNow;
}
За исключением того, что Windows уже написала для вас такую функцию: GetSystemTime
Местный, а не UTC
А теперь, если вы не хотите, чтобы текущее время было в UTC. Что делать, если вы хотите это по местному времени? Windows предоставляет функцию для преобразования FILETIME
в UTC в ваше местное время: FileTimeToLocalFileTime
Вы могли бы написать функцию, которая возвращает вам FILETIME
в локальном времени уже:
FILETIME GetLocalTimeAsFileTime()
{
FILETIME ftNow;
GetSystemTimeAsFileTime(ref ftNow);
//convert to local
FILETIME ftNowLocal
FileTimeToLocalFileTime(ftNow, ref ftNowLocal);
return ftNowLocal;
}
Допустим, вы хотите декодировать локальный FILETIME в SYSTEMTIME. Это не проблема, вы можете использовать FileTimeToSystemTime
снова:
К счастью, Windows уже предоставляет вам функцию, которая возвращает вам значение:
Precise
Есть еще одно соображение. До Windows 8 часы имели разрешение около 15 мс. В Windows 8 они улучшили время до 100 нс (что соответствует разрешению FILETIME
).
GetSystemTimeAsFileTime
(устаревшее, разрешение 15 мс)
GetSystemTimeAsPreciseFileTime
(Windows 8, разрешение 100 нс)
Это означает, что мы всегда должны отдавать предпочтение новому значению:
Вы попросили время
Вы спросили время; но у вас есть выбор.
Часовой пояс:
- UTC (системная система)
- Местный часовой пояс
Формат:
FILETIME
(системный, разрешение 100 нс)
SYTEMTIME
(расшифровано, разрешение 1 мс)
Резюме
- UTC:
GetSytemTimeAsPreciseFileTime
(или GetSystemTimeAsFileTime
)
- Местный: (сверните свой)
* Разрешение 1159 * 1 мс:
SYSTEMTIME
- UTC:
GetSystemTime
- Местный:
GetLocalTime