Win32 C++ SystemTimeToFileTime, FileTimeToLocalFileTime, вызываемый после VariantTimeToSystemTime, дает неверные результC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Win32 C++ SystemTimeToFileTime, FileTimeToLocalFileTime, вызываемый после VariantTimeToSystemTime, дает неверные результ

Сообщение Anonymous »

Я читаю значение времени WPD_OBJECT_DATE_MODIFIED файла/папки на портативном устройстве (WPD), и мне нужно отобразить его так же, как это делает Проводник. У меня есть папка, дата изменения которой отображается в проводнике как 01.01.2015, 12:00.
Мне нужно получить ту же отформатированную строку. В моем приложении следующий код работает, но значения отключены, как показано ниже:

Код: Выделить всё

SYSTEMTIME systemTime = { 0 };
FILETIME fileTime = { 0 };
FILETIME localFileTime = { 0 };
PROPVARIANT pvDateModified;
PropVariantInit(&pvDateModified);
//...
HRESULT hrDateModified = pObjectProperties->GetValue(WPD_OBJECT_DATE_MODIFIED, &pvDateModified);
if (pvDateModified.vt != VT_EMPTY) {

// (0) Comes back as Variant Time:
// RESULT:
//        pvDateModified.date = 42005.000000000

// (1) Need to convert to System Time first:
// RESULT:
//        wYear=2015
//        wMonth=1
//        wDay=1
VariantTimeToSystemTime(pvDateModified.date, &systemTime);

// (3) In order to use SHDateFormatTime, need to convert to File Time:
// RESULT:
//        dwLowDateTime  = 3803807744
//        dwHighDateTime = 30418261
SystemTimeToFileTime(&systemTime, &fileTime);

// (4) Format using SHFormatDateTime:
// RESULT:
//        12/31/2014 7:00 PM
wchar_t datebuf[80];
DWORD flags = FDTF_NOAUTOREADINGORDER | FDTF_DEFAULT; // tried with and without, no difference
SHFormatDateTime(&fileTime, &flags, datebuf, 80);
//...
}
Результат неверен на 5 часов, 31.12.2014, 19:00. Затем я попытался пойти дальше и получить местное время, но это отбросило меня еще дальше, к 31.12.2014, 14:00:

Код: Выделить всё

// (4) Convert to Local Time First:
// RESULT:
//         dwLowDateTime   = 4192434176
//         dwHighDateTime  = 30418219
FileTimeToLocalFileTime(&fileTime, &localFileTime);

// (5) Format using SHFormatDateTime:
// RESULT:
//         12/31/2014 2:00 PM
wchar_t datebuf[80];
DWORD flags = FDTF_NOAUTOREADINGORDER | FDTF_DEFAULT; // tried with and without, no difference
SHFormatDateTime(&localFileTime, &flags, datebuf, 80);
//...
В отладчике я вижу, что исходное системное время systemTime правильное: 1/1/2015. Но я не могу использовать это время для вызова форматированной строки SHFormatDateTime, для этого требуется только FILETIME, а не SYSTEMTIME. Но где-то при преобразовании из SYSTEMTIME в FILETIME возникает проблема.

Подробнее здесь: https://stackoverflow.com/questions/798 ... arianttime
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»