| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 编程开发 > Visual C++教程 > 文章正文 用户登录
网络营销之google
Google质疑艾瑞报
google使用技巧
Google Adsense改
王通:Google应该
Google真的那么容
Google 广告联盟
Google Adsense将
Google AdSense开
阿里联盟发布yaho

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

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

作者:佚名 来源:CSDN 作者: zhengyun_ustc 更新:2006-8-25 21:05:35 错误报告 我要投稿

一个小技巧,权当对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;

}

 

 

 

文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。