正確的方法是使用DATE
類型或VARIANT
。要從time_t
到達那裏,需要進行一些轉換。
標頭下面的代碼:
#include <windows.h>
#include <comdef.h>
#include <oleauto.h>
#include <time.h>
#include <exception>
首先,拿到C++ time_t
要轉換。
// get the time_t to convert
time_t cpp_time = ...;
然後,轉換C++ time_t
到Windows FILETIME
。 (這部分已從here中解除)。
// convert C++ time_t to Windows FILETIME
FILETIME windows_file_time;
{
auto ll = Int32x32To64(cpp_time, 10000000) + 116444736000000000;
windows_file_time.dwLowDateTime = (DWORD)ll;
windows_file_time.dwHighDateTime = ll >> 32;
}
然後,在Windows FILETIME
轉換到Windows SYSTEMTIME
。
// convert Windows FILETIME to Windows SYSTEMTIME
SYSTEMTIME windows_system_time;
if (!FileTimeToSystemTime(&windows_file_time, &windows_system_time))
throw new std::exception();
最後,在Windows SYSTEMTIME
轉換爲VARIANT DATE
。
// convert Windows FILETIME to VARIANT DATE
DATE variant_date;
if (SystemTimeToVariantTime(&windows_system_time, &variant_date) != TRUE)
throw new std::exception();
如果你想驗證以上的作品,您可以將DATE
轉換爲字符串(BSTR
)。
// convert DATE to string (for verification purposes)
bstr_t variant_date_string;
if (FAILED(VarBstrFromDate(variant_date, 0, 0, variant_date_string.GetAddress())))
throw new std::exception();
OutputDebugStringW(variant_date_string);
如果您需要/想使用VARIANT
代替DATE
,只是包裝的DATE
在VARIANT
結構。
// wrap DATE in a VARIANT
VARIANT v_variant_date;
v_variant_date.date = variant_date;
v_variant_date.vt = VT_DATE;
爲了驗證這部分的工作,你可以說VARIANT
轉換爲字符串(BSTR
)。
// convert VARIANT to string (for verification purposes)
variant_t v_variant_date_string;
v_variant_date_string.ChangeType(VT_BSTR, &v_variant_date);
OutputDebugStringW(v_variant_date_string.bstrVal);