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

类别:VC语言 点击:0 评论:0 推荐:
一个小技巧,权当对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<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;

}

 

 

 

本文地址:http://com.8s8s.com/it/it1535.htm