Как преобразовать время в миллисекундах в FILETIME в С++

У меня есть время в секундах (например: 1505306792).

Как преобразовать это в FILETIME?

Вот код, который я пробовал

    INT64 timer64 = 1505306792;

    timer64 = timer64 *1000 *10000;

    ULONGLONG xx = timer64;

    FILETIME fileTime;
    ULARGE_INTEGER uliTime;

    uliTime.QuadPart = xx;
    fileTime.dwHighDateTime = uliTime.HighPart;
    fileTime.dwLowDateTime = uliTime.LowPart;

Этот результат FILETIME приходит как 1648-09-13 15:34:00

Я ожидаю, что эта дата будет 2017-09-13 12:46:31. Я получаю то же самое при использовании онлайн-конвертеров.

Есть идеи, как это решить?

Я видел некоторые ответы, используя boost, но он доступен в моем проекте.


person Srikanth    schedule 13.09.2017    source источник
comment
Одна миллисекунда = 1/1000 секунды. Почему вы умножаете на десять миллионов?   -  person tadman    schedule 13.09.2017
comment
Первый конвертер файлового времени, который я искал (silisoftware.com/tools/), когда вы используете его настройки по умолчанию и вводите 1505306792, вы получаете вывод среды, 13 сентября 2017 г., 12:46:32. Основываясь на его значении по умолчанию, я думаю, вам нужно сосредоточиться на формате ввода unix.   -  person Scott Mermelstein    schedule 13.09.2017
comment
Есть разница в эпохе: stackoverflow.com/questions/6161776/   -  person doctorlove    schedule 13.09.2017


Ответы (1)


Речь идет о добавлении 116444736000000000, см. Как преобразовать UNIX time_t в Win32 FILETIME или SYSTEMTIME:

   #include <winbase.h>
   #include <winnt.h>
   #include <time.h>

   void UnixTimeToFileTime(time_t t, LPFILETIME pft)
   {
     // Note that LONGLONG is a 64-bit value
     LONGLONG ll;

     ll = Int32x32To64(t, 10000000) + 116444736000000000;
     pft->dwLowDateTime = (DWORD)ll;
     pft->dwHighDateTime = ll >> 32;
   }
person Roman R.    schedule 13.09.2017
comment
Windows использует 1 января 1601 года как эпоху? Как вообще странно. - person tadman; 13.09.2017
comment
Очевидно, что людям нужны электронные таблицы, которые уходят так далеко в прошлое. И не дальше. - person doctorlove; 13.09.2017