2017-02-19 10 views
2

Добрый день. У меня есть время в мс с 1/1/1970, например. 1487520625361C++ set Время работы Windows от ms 1/1/1970

Итак, мне нужно установить время Windows. Я нашел функцию SetLocalTime (& SYSTEMTIME). Итак, мне нужно разобрать количество мс, или это можно сделать более легко?

+0

У вас есть местный или UTC? –

+0

@MatteoItalia UTC, но неважно, что время на ПК будет в UTC – Evgeniy175

+2

Преобразуйте в 'FILETIME' сначала (базовую алгебру), а затем в' SYSTEMTIME' (используя функцию FileTimeToSystemTime). –

ответ

2

В общем, вы никогда не хотите работать с структурой 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.

+0

Это работает, спасибо! – Evgeniy175