正确的方法是使用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);