将bstr转换为datetime格式

时间:2014-04-07 07:34:33

标签: visual-c++ wmi

我正在使用操作系统信息及其InstallDate操作系统属性的功能。我得到了BSTR变体类型

的字符串格式的输出
   VARIANT var1;

   hres = pclsObj->Get(L"InstallDated", 0, &var1, 0, 0);
   wcout << "Event Log time generated : " << var1.bstrVal << endl;

以字符串格式提供输出.20121110080510。我想它只是日期和时间。我应该如何以日期格式解析此属性或函数?

3 个答案:

答案 0 :(得分:0)

是的,似乎是字符串格式的日期 - YYYYMMDDHHMM。

我认为您可以使用sscanf函数从字符串中选择年,月,日等等,之后您可以将其存储在SYSTEMTIME结构中。

答案 1 :(得分:0)

C ++

从我自己的代码中摘录

此处timeGenerated是BSTR,其值为20190507140217.848430-000 而eventLogItem.TimeGenerated是std :: string

if (timeGenerated.bstrVal != NULL)
{
    // convert to YYYY-MM-DD HH:MM:SS
    eventLogItem.TimeGenerated = _bstr_t(timeGenerated.bstrVal);
    eventLogItem.TimeGenerated = eventLogItem.TimeGenerated.substr(0, 4) + "-" +
        eventLogItem.TimeGenerated.substr(4, 2) + "-" +
        eventLogItem.TimeGenerated.substr(6, 2) + " " +
        eventLogItem.TimeGenerated.substr(8, 2) + ":" +
        eventLogItem.TimeGenerated.substr(10, 2) + ":" +
        eventLogItem.TimeGenerated.substr(12, 2);
}

输出 2019-05-07 14:09:32

时区代码

// Get the current timezone information
TIME_ZONE_INFORMATION timezone;
memset(&timezone, 0, sizeof(PTIME_ZONE_INFORMATION));
GetTimeZoneInformation(&timezone);

my blog上的完整源代码

答案 2 :(得分:0)

如果使用 boost :: posix_time 表示应用程序中的日期/时间信息,则可以对事件日志日期实现以下转换:

// Helper function
std::string wstring_to_utf8(const std::wstring& str)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
    return myconv.to_bytes(str);
}

VARIANT var1;
hres = pclsObj->Get(L"InstallDated", 0, &var1, 0, 0);
boost::posix_time::time_input_facet *tif = new boost::posix_time::time_input_facet;
tif->format("%Y%m%d%H%M%s-000");
std::istringstream iss(wstring_to_utf8(var1.bstrVal));
iss.imbue(std::locale(std::locale::classic(), tif));
boost::posix_time::ptime datetime;
iss >> datetime;

如果您看到 new 运算符,但是不要看到 delete ,请不要感到困惑,因为time_input_facet结构会自动删除。