boost 时间与日期处理

来源:互联网 发布:淘宝可以用黑体吗 编辑:程序博客网 时间:2024/05/22 06:12
特点缺点说明timer计时基类不适合大跨度时间适用大部分的普通计时progress_timer继承自timer 可以自动写入流中只精确到0.01s如果需要更精确,可派生个类,调用stream的precision设置progress_display图形化显示进度只能输出到cout如果还有其他输出则会干扰进度显示。
折中的办法是重新显示 pd.restart(size); pd+= pNum;
date日期结构,时间点——date是date_time库的核心类 boost::gregoriandate_durationdays、months、years 时间段——表示一段时间,可以把它看成一个intdate_period标量,左开右闭,时间区间——可以认为是一个有起点的date_duration。能做交集、并集date_iterator迭代器,以某个单位增减——天、周、月、年四种迭代器,以某种增量移动。time_duration时间段 同date_duration——hours、minutes、seconds、millisec、boost::posix_timeptime时间点 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 <boost/timer.hpp>#include <boost/progress.hpp>#include <iostream>#include <sstream>#include <fstream>#include <string>#include <vector>#include <Windows.h>#include <boost/date_time/gregorian/gregorian.hpp>#include <boost/date_time/posix_time/posix_time.hpp>using namespace std;int main(){boost::timer t;std::cout<<"Max "<<t.elapsed_max()<<endl;std::cout<<"Min "<<t.elapsed_min()<<endl;std::cout<<"elapsed: "<<t.elapsed()<<endl;t.restart();Sleep(100);std::cout<<"elapsed: "<<t.elapsed()<<endl; cout<<"---------------------------"<<endl;stringstream ss;{boost::progress_timer t(ss); Sleep(300);}cout<<ss.str();cout<<"---------------------------"<<endl;vector<string> v(100);//Do Data Fill...... ofstream fs("c:\test.txt");boost::progress_display pd(v.size());vector<string>::iterator pos;for (pos = v.begin();pos != v.end();++pos){fs<<*pos<<endl;Sleep(10);++pd;//pd.restart(v.size());//pd+=(pos-v.begin() +1);}cout<<"---------------------------"<<endl;{using namespace boost::gregorian;cout<<"-----------------  date ------------------"<<endl;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<<day_clock::local_day()<<endl;cout<<day_clock::universal_day()<<endl;date d6 (neg_infin);date d7(pos_infin);cout<<d6<<endl;cout<<d7<<endl;cout<<"---------------------------"<<endl;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); //星期几 周日为0cout<<today.day_of_year()<<endl;//在一年中是第几天assert(today.end_of_month() == date(2013,4,30));//当月的最后一天cout<<today.week_number()<<endl;//当年的第几周 范围0~53 年初的半周归为上一年,即53assert(d6.is_infinity());//日期为无限日期assert(d6.is_neg_infinity());cout<<"---------------------------"<<endl;cout<<to_simple_string(today)<<endl;cout<<to_iso_string(today)<<endl;cout<<to_iso_extended_string(today)<<endl;//常用日期格式YYYY-MM-DDcout<<today<<endl;cout<<"---------------------------"<<endl;tm t = to_tm(today);assert(t.tm_hour == 0 && t.tm_min == 0);date new_today = date_from_tm(t);//从tm转为dateassert(new_today == today);cout<<"-------------- days(date_duration) --------------"<<endl;days dd1(10),dd2(-20),dd3(365);assert(dd1>dd2 &&dd1<dd3);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 --------------"<<endl;date dA(2000,1,1),dB(2008,8,8);cout<<dB-dA<<endl;//3142天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);//如果日期是月末的最后一天,加减月或年会得到月末的时间,而不是简单的月、年加1date 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 --------------"<<endl;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<<dp<<endl;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 --------------"<<endl;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);//增减步长为3assert(y_iter == last + days(1));++y_iter;assert(y_iter->year() == 2016);cout<<"-------------- func --------------"<<endl;cout<<(gregorian_calendar::is_leap_year(2000)? "Yes":"no")<<endl;//闰年assert(gregorian_calendar::end_of_month_day(2013,2) == 28);//月末天}{using namespace boost::posix_time;cout<<"-------------- time_duration --------------"<<endl;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);//转为sechours h(-10);assert(h.is_negative());time_duration h2 = h.invert_sign();//取反assert(!h2.is_negative() && h2.hours() == 10);cout<<td3-td2<<endl;cout<<to_simple_string(td4)<<endl;cout<<to_iso_string(td4)<<endl;cout<<"-------------- ptime --------------"<<endl;{using namespace boost::gregorian;ptime p(date(2013,4,17),hours(1));//ptime相当于date+time_durationptime p1 = time_from_string("2013-4-17 16:25:00");cout<<p<<endl;cout<<p1<<endl;ptime p2 = second_clock::local_time();//常用时间输出ptime p3 = microsec_clock::universal_time();//微秒精度cout<<p2<<endl<<p3<<endl;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<<to_iso_extended_string(op)<<endl;tm t = to_tm(op);//不可逆,此处与date不同//只能用date_from_tm先得到日期,再填充时间。cout<<"-------------- time_period --------------"<<endl;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 --------------"<<endl;for (time_iterator t_iter(op,minutes(10));t_iter<op+hours(1);++t_iter){cout<<*t_iter<<endl;}cout<<"-------------- formate --------------"<<endl;date_facet* dfacet = new date_facet("%Y 年%m 月%d 日");cout.imbue(locale(cout.getloc(),dfacet));cout<<date(2013,4,17)<<endl;time_facet* tfacet = new time_facet("%Y 年%m 月%d 日 %H点%M分%S%F秒");cout.imbue(locale(cout.getloc(),tfacet));cout<<op<<endl;}}getchar();return 0;}
运行结果:

Max 2.14748e+006Min 0.001elapsed: 0.001elapsed: 0.1---------------------------0.30 s---------------------------0% 10 20 30 40 50 60 70 80 90 100%|----|----|----|----|----|----|----|----|----|----|***************************************************-------------------------------------------- date ------------------2013-Apr-172013-Apr-17-infinity+infinity---------------------------10716---------------------------2013-Apr-17201304172013-04-172013-Apr-17----------------------------------------- days(date_duration) ---------------------------- Calc --------------3142-------------- date_period --------------[2013-Apr-17/2013-Apr-30]-------------- date_iterator ---------------------------- func --------------Yes-------------- time_duration --------------01:08:58.99900001:10:10.300000011010.300000-------------- ptime --------------2013-Apr-17 01:00:002013-Apr-17 16:25:002013-Apr-17 17:19:212013-Apr-17 09:19:21.8706042013-04-17T01:30:00-------------- time_period ---------------------------- time_iterator --------------2013-Apr-17 01:30:002013-Apr-17 01:40:002013-Apr-17 01:50:002013-Apr-17 02:00:002013-Apr-17 02:10:002013-Apr-17 02:20:00-------------- formate --------------2013 年04 月17 日2013 年04 月17 日 01点30分00秒


0 0