UNIX风格的时间单位一般会是这样:
YYMMDD
,比如说“0308011644”。
但是,实际上MFC的COleDateTime类不支持这种格式,而且COleDateTime的背后使用的VarDateFromStr也一样不支持。
实际上,VarDateFromStr只会支持这样的近似UNIX格式:
03 08 01 16:44
所以我们必须转换UNIX风格为近似UNIX风格,也就是说:
从“0308011644”
到“03 08 01 16:44”。
然后,让VarDateFromStr&VarBstrFromDate把它转换为“2003-8-1 16:44:00”。
首先,批分“0308011644”,我们还是可以用boost:tokenizer,和批分电话号码不一样的是,这里需要按照数字的位数分割,所以要用到:
int offsets[] = {2,2,2};
boost::offset_separator f(offsets, offsets+3);
上面的分隔符告诉tokenizer,按照2,2,2的方式分割,我们用这么一行代码来实现它:
boost::tokenizer<boost::offset_separator> tok1(s,f);
代码如下,利用到了boost:tokenizer技术和VarDateFromStr&VarBstrFromDate技术:
//////////////////////////////////////////////////////////// // STL&BOOST 头文件: #pragma warning(disable:4786) #include <boost/tokenizer.hpp> #include <string> //////////////////////////////////////////////////////////// /******************************************************* // 函 数 名 : ParseUNIXDateTime // 所属类名 : CProcessorThread // 函数功能 : 解析UNIX风格的时间单位"0308011644" 出来的结果是"2003-8-1 16:44:00" // 处理过程 : // 备 注 : // 作 者 : 郑昀 // 时 间 : 2003年8月11日 // 返 回 值 : _bstr_t // 参数说明 : _bstr_t &bstrUNIXDateTime *******************************************************/ _bstr_t CProcessorThread::ParseUNIXDateTime(_bstr_t &bstrUNIXDateTime) { ////////////////////////////////// // 特殊手段 // 为了纠正传入的UNIX风格时间"0308011644" // 引入boost:tokenizer,最终转换为"03 08 01 16:44" _bstr_t bstrDoneDateTime(""); { //////////////////////////////////////////////////////////////////// std::string s(bstrUNIXDateTime); int offsets[] = {2,2,2}; boost::offset_separator f(offsets, offsets+3); boost::tokenizer<boost::offset_separator> tok1(s,f); int nIndex = 0; boost::tokenizer<boost::offset_separator>::const_iterator itBegin = tok1.begin(); boost::tokenizer<boost::offset_separator>::const_iterator itEnd = tok1.end(); boost::tokenizer<boost::offset_separator>::iterator beg; // 前面按照我们给的方式分割好了时间单位,这里循环: for(beg = tok1.begin(); \ beg != itEnd; \ ++beg, ++nIndex) { bstrDoneDateTime += _bstr_t((*beg).c_str()); // 按照年,月,日,时,分的顺序,事先排列好 switch(nIndex) { case 0:// 03 case 1:// 08 case 2:// 01 bstrDoneDateTime += _bstr_t(" "); break; case 3:// 16 bstrDoneDateTime += _bstr_t(":"); break; default: break; } }; // 最后结果,时间从"0308011644"转换为"03 08 01 16:44"了 //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// // // 既然已经转换为了"03 08 01 16:44",我们还需要进一步转换为标准时间"2003-8-1 16:44:00" // if(bstrDoneDateTime.length() > 0) { double dDateNew = 0.0; LCID lcid; lcid = GetSystemDefaultLCID(); HRESULT hr = VarDateFromStr(bstrDoneDateTime, lcid, LOCALE_NOUSEROVERRIDE, &dDateNew); BSTR bstrOut = NULL; VarBstrFromDate(dDateNew, lcid, LOCALE_NOUSEROVERRIDE, &bstrOut); bstrDoneDateTime = _bstr_t(bstrOut, false); } } ////////////////////////////////// return bstrDoneDateTime; } |