您的位置:首页 > 其它

[Boost]如何将UNIX风格时间转换为标准格式

2008-01-03 20:21 686 查看

一个小技巧,权当对Great Boost的致敬。

如何将UNIX风格时间转换为标准格式

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 tok1(s,f); 代码如下,利用到了boost:tokenizer技术和VarDateFromStr&VarBstrFromDate技术:
////////////////////////////////////////////////////////////// STL&BOOST 头文件:#pragma warning(disable:4786)#include #include //////////////////////////////////////////////////////////// /*******************************************************//     函 数 名 : 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 tok1(s,f);                            int nIndex = 0;              boost::tokenizer::const_iterator itBegin = tok1.begin();              boost::tokenizer::const_iterator itEnd   = tok1.end();              boost::tokenizer::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;} 
  

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12726
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: