柚子快报邀请码778899分享:boost 时间与日期处理

http://yzkb.51969.com/

博客转载自:

特点

缺点

说明

timer

计时基类

不适合大跨度时间

适用大部分的普通计时

progress_timer

继承自timer 可以自动写入流中

只精确到0.01s

如果需要更精确,可派生个类,调用stream的precision设置

progress_display

图形化显示进度

只能输出到cout

如果还有其他输出则会干扰进度显示。折中的办法是重新显示 pd.restart(size); pd+= pNum;

date

日期结构,时间点

——

date是date_time库的核心类 boost::gregorian

date_duration

days、months、years 时间段

——

表示一段时间,可以把它看成一个int

date_period

标量,左开右闭,时间区间

——

可以认为是一个有起点的date_duration。能做交集、并集

date_iterator

迭代器,以某个单位增减

——

天、周、月、年四种迭代器,以某种增量移动。

time_duration

时间段 同date_duration

——

hours、minutes、seconds、millisec、boost::posix_time

ptime

时间点 date+time_duration

——

分date()和time_of_day()操作。

time_period

时间区间 同date_period

——

——

time_iterator

迭代器,以某个单位增减

——

可直接与ptime比较

date_facet

流格式化日期

——

%Y年%m月%d日

time_facet

流格式化时间

——

%Y年%m月%d日 %H点%M分%S%F秒

 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

int main()

{

boost::timer t;

std::cout<<"Max "<

std::cout<<"Min "<

std::cout<<"elapsed: "<

t.restart();

Sleep(100);

std::cout<<"elapsed: "<

cout<<"---------------------------"<

stringstream ss;

{

boost::progress_timer t(ss);

Sleep(300);

}

cout<

cout<<"---------------------------"<

vector v(100);

//Do Data Fill......

ofstream fs("c:\test.txt");

boost::progress_display pd(v.size());

vector::iterator pos;

for (pos = v.begin();pos != v.end();++pos)

{

fs<<*pos<

Sleep(10);

++pd;

//pd.restart(v.size());

//pd+=(pos-v.begin() +1);

}

cout<<"---------------------------"<

{

using namespace boost::gregorian;

cout<<"----------------- date ------------------"<

date d1;

date d2(2013,4,7);

date d3(2013,Apr,7);

date d4(d2);

assert(d1 == date(not_a_date_time)); //默认初始化为无效日期

assert(d2 == d4);

assert(d3 == d2);

d1 = from_string("1999,9,9");

date d5 (from_string("2008/8/8"));

d3 = from_undelimited_string("20110111");

cout<

cout<

date d6 (neg_infin);

date d7(pos_infin);

cout<

cout<

cout<<"---------------------------"<

date today (2013,4,17);

assert(today.year() == 2013);

assert(today.month() == 4);

assert(today.day() == 17);

date::ymd_type ymd = today.year_month_day();

assert(ymd.year == 2013);

assert(ymd.month == 4);

assert(ymd.day == 17);

assert(today.day_of_week() == 3); //星期几 周日为0

cout<

assert(today.end_of_month() == date(2013,4,30)); //当月的最后一天

cout<

assert(d6.is_infinity()); //日期为无限日期

assert(d6.is_neg_infinity());

cout<<"---------------------------"<

cout<

cout<

cout<

cout<

cout<<"---------------------------"<

tm t = to_tm(today);

assert(t.tm_hour == 0 && t.tm_min == 0);

date new_today = date_from_tm(t); //从tm转为date

assert(new_today == today);

cout<<"-------------- days(date_duration) --------------"<

days dd1(10),dd2(-20),dd3(365);

assert(dd1>dd2 &&dd1

assert(dd1+dd2 == days(-10));

assert((dd2+dd3).days() == 345);

assert(dd3/5 == days(73));

weeks w(3); //3个星期

assert(w.days() == 21);

months m(5);

years y(2);

months m2 = y+m;

assert(m2.number_of_months() == 29);

assert((y*2).number_of_years() == 4);

cout<<"-------------- Calc --------------"<

date dA(2000,1,1),dB(2008,8,8);

cout<

dA+=days(10);

assert(dA.day() == 11);

dA+=months(2);

assert(dA.month() ==3 && dA.day()== 11);

dA-=weeks(1);

assert(dA.day() == 4);

dB-=years(7);

assert(dA.year() == dB.year()-1);

//如果日期是月末的最后一天,加减月或年会得到月末的时间,而不是简单的月、年加1

date sp(2013,3,30);

sp-=months(1);

assert(sp.month() == 2 && sp.day() == 28);

sp -=months(1);

assert(sp.month()== 1 && sp.day()== 31);

sp+=months(2);

assert(sp.day() == 31); //与原来的日期已经不相等!

cout<<"-------------- date_period --------------"<

date_period dp(date(2013,4,17),days(14)); //左开右闭与STL的容器相似

assert(!dp.is_null());

assert(dp.begin().day() == 17);

assert(dp.last().day() == 30);

assert(dp.end().day() == 1);

cout<

date_period new_dp = dp;

new_dp.shift(days(3)); //将时间区间向后移动

assert(new_dp.begin().day() == 20);

assert(new_dp.length().days() == 14);

new_dp.expand(days(3)); //区间两段延长n天,即延长2n天。

assert(new_dp.begin().day() == 17);

assert(new_dp.length().days() == 20);

assert(dp.is_after(date(2013,1,1)));

assert(dp.contains(date(2013,4,20)));

date_period dp2 (date(2013,4,17),days(5));

assert(dp.contains(dp2));

assert(dp.intersects(dp2)); //交集

assert(dp.intersection(dp2) == dp2);

date_period dp3 (date(2013,5,1),days(5));

assert(!dp3.intersects(dp));

assert(dp3.intersection(dp2).is_null());

assert(dp.is_adjacent(dp3));

date_period dp4(date(2013,4,17),days(19)); //并集

assert(dp.merge(dp3).is_null()); //无交集返回空

assert(dp.span(dp3) == dp4); //填充中间区域

cout<<"-------------- date_iterator --------------"<

date last(2013,4,17);

day_iterator d_iter(last); //日期迭代器

assert(d_iter == last);

++d_iter;

assert(d_iter == date(2013,4,18));

year_iterator y_iter(*d_iter,3); //增减步长为3

assert(y_iter == last + days(1));

++y_iter;

assert(y_iter->year() == 2016);

cout<<"-------------- func --------------"<

cout<<(gregorian_calendar::is_leap_year(2000)? "Yes":"no")<

assert(gregorian_calendar::end_of_month_day(2013,2) == 28); //月末天

}

{

using namespace boost::posix_time;

cout<<"-------------- time_duration --------------"<

time_duration td(1,1,1); //时、分、秒 会自动借、进位

hours h0(1);

minutes m(1);

seconds s(1);

millisec ms(1);

time_duration td2 = h0+m+s+ms;

time_duration td3 = hours(2) + minutes(10);

time_duration td4 = duration_from_string("1:10:10:300");

assert(td4.hours() == 1 && td4.minutes() == 10 && td4.seconds() == 10);

assert(td.total_seconds() == 1*3600 + 1*60 +1); //转为sec

hours h(-10);

assert(h.is_negative());

time_duration h2 = h.invert_sign(); //取反

assert(!h2.is_negative() && h2.hours() == 10);

cout<

cout<

cout<

cout<<"-------------- ptime --------------"<

{

using namespace boost::gregorian;

ptime p(date(2013,4,17),hours(1)); //ptime相当于date+time_duration

ptime p1 = time_from_string("2013-4-17 16:25:00");

cout<

cout<

ptime p2 = second_clock::local_time(); //常用时间输出

ptime p3 = microsec_clock::universal_time(); //微秒精度

cout<

ptime op(date(2013,4,17),hours(1)+minutes(30));

date d = op.date();

time_duration optd = op.time_of_day();

assert(d.day() == 17 && d.month() == 4);

assert(optd.hours() == 1 && optd.minutes() == 30);

cout<

tm t = to_tm(op); //不可逆,此处与date不同

//只能用date_from_tm先得到日期,再填充时间。

cout<<"-------------- time_period --------------"<

time_period tp1 (op,hours(8));

time_period tp2(op+hours(8),hours(1));

assert(tp1.end() == tp2.begin() && tp1.is_adjacent(tp2));

assert(!tp1.intersects(tp2));

tp1.shift(hours(1));

assert(tp1.is_after(op));

assert(tp1.intersects(tp2));

tp2.expand(hours(10));

assert(tp2.contains(op) && tp2.contains(tp1));

cout<<"-------------- time_iterator --------------"<

for (time_iterator t_iter(op,minutes(10));t_iter

{

cout<<*t_iter<

}

cout<<"-------------- formate --------------"<

date_facet* dfacet = new date_facet("%Y 年%m 月%d 日");

cout.imbue(locale(cout.getloc(),dfacet));

cout<

time_facet* tfacet = new time_facet("%Y 年%m 月%d 日 %H点%M分%S%F秒");

cout.imbue(locale(cout.getloc(),tfacet));

cout<

}

}

getchar();

return 0;

}

  

运行结果:

Max 2.14748e+006

Min 0.001

elapsed: 0.001

elapsed: 0.1

---------------------------

0.30 s

---------------------------

0% 10 20 30 40 50 60 70 80 90 100%

|----|----|----|----|----|----|----|----|----|----|

***************************************************

---------------------------

----------------- date ------------------

2013-Apr-17

2013-Apr-17

-infinity

+infinity

---------------------------

107

16

---------------------------

2013-Apr-17

20130417

2013-04-17

2013-Apr-17

---------------------------

-------------- days(date_duration) --------------

-------------- Calc --------------

3142

-------------- date_period --------------

[2013-Apr-17/2013-Apr-30]

-------------- date_iterator --------------

-------------- func --------------

Yes

-------------- time_duration --------------

01:08:58.999000

01:10:10.300000

011010.300000

-------------- ptime --------------

2013-Apr-17 01:00:00

2013-Apr-17 16:25:00

2013-Apr-17 17:19:21

2013-Apr-17 09:19:21.870604

2013-04-17T01:30:00

-------------- time_period --------------

-------------- time_iterator --------------

2013-Apr-17 01:30:00

2013-Apr-17 01:40:00

2013-Apr-17 01:50:00

2013-Apr-17 02:00:00

2013-Apr-17 02:10:00

2013-Apr-17 02:20:00

-------------- formate --------------

2013 年04 月17 日

2013 年04 月17 日 01点30分00秒

 

柚子快报邀请码778899分享:boost 时间与日期处理

http://yzkb.51969.com/

参考文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。