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