В общем, вы никогда не хотите работать с структурой SYSTEMTIME
(которая уже разделена и полезна только для отображения), но с FILETIME
(время, выраженное как количество интервалов 100 нс с 1/1/1601), и конвертировать как раз в конце ваших расчетов.
Так что вам нужно:
- конвертировать мс с 1/1/1970 до 100 нс, так 1/1/1601;
- положил результат в
FILETIME
;
- преобразовать
FILETIME
в SYSTEMTIME
;
- звонок
SetLocalTime
(если исходная временная метка была по местному времени) или SetSystemTime
(если это было в UTC).
Самый скучный шаг - первый, так как вам нужно рассчитать разницу между двумя Эпоками; К счастью, это уже сделано в KB167296, и оказывается, что число мы после это 116444736000000000.
Итак:
void msecSinceEpochToFileTime(uint64_t msecSinceEpoch, FILETIME *ft) {
uint64_t result = msecSinceEpoch * 10000; // ms => 100ns
result += 116444736000000000ULL; // Unix epoch in FILETIME
ft->dwLowDateTime = (DWORD) result;
ft->dwHighDateTime = result >> 32;
}
Тогда преобразование FILETIME
в SYSTEMTIME
это просто вопрос вызова FileTimeToSystemTime.
У вас есть местный или UTC? –
@MatteoItalia UTC, но неважно, что время на ПК будет в UTC – Evgeniy175
Преобразуйте в 'FILETIME' сначала (базовую алгебру), а затем в' SYSTEMTIME' (используя функцию FileTimeToSystemTime). –