boost 时间与日期处理

特点 缺点 说明
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秒
  1. #include <boost/timer.hpp>  
  2. #include <boost/progress.hpp>  
  3. #include <iostream>  
  4. #include <sstream>  
  5. #include <fstream>  
  6. #include <string>  
  7. #include <vector>  
  8. #include <Windows.h>  
  9.   
  10. #include <boost/date_time/gregorian/gregorian.hpp>  
  11. #include <boost/date_time/posix_time/posix_time.hpp>  
  12.   
  13. using namespace std;  
  14.   
  15. int main()  
  16. {  
  17.     boost::timer t;  
  18.     std::cout<<"Max "<<t.elapsed_max()<<endl;  
  19.     std::cout<<"Min "<<t.elapsed_min()<<endl;  
  20.     std::cout<<"elapsed: "<<t.elapsed()<<endl;  
  21.     t.restart();  
  22.     Sleep(100);  
  23.     std::cout<<"elapsed: "<<t.elapsed()<<endl;   
  24.     cout<<"---------------------------"<<endl;  
  25.     stringstream ss;  
  26.     {  
  27.         boost::progress_timer t(ss);   
  28.         Sleep(300);  
  29.     }  
  30.     cout<<ss.str();  
  31.     cout<<"---------------------------"<<endl;  
  32.   
  33.     vector<string> v(100);  
  34.     //Do Data Fill......   
  35.     ofstream fs("c:\test.txt");  
  36.   
  37.     boost::progress_display pd(v.size());  
  38.     vector<string>::iterator pos;  
  39.     for (pos = v.begin();pos != v.end();++pos)  
  40.     {  
  41.         fs<<*pos<<endl;  
  42.         Sleep(10);  
  43.         ++pd;  
  44.         //pd.restart(v.size());  
  45.         //pd+=(pos-v.begin() +1);  
  46.     }  
  47.     cout<<"---------------------------"<<endl;  
  48.       
  49.     {  
  50.         using namespace boost::gregorian;  
  51.         cout<<"-----------------  date ------------------"<<endl;  
  52.         date d1;  
  53.         date d2(2013,4,7);  
  54.         date d3(2013,Apr,7);  
  55.         date d4(d2);  
  56.   
  57.         assert(d1 == date(not_a_date_time)); //默认初始化为无效日期  
  58.         assert(d2 == d4);  
  59.         assert(d3 == d2);  
  60.           
  61.         d1 = from_string("1999,9,9");  
  62.         date d5 (from_string("2008/8/8"));  
  63.         d3 = from_undelimited_string("20110111");  
  64.           
  65.         cout<<day_clock::local_day()<<endl;  
  66.         cout<<day_clock::universal_day()<<endl;  
  67.   
  68.         date d6 (neg_infin);  
  69.         date d7(pos_infin);  
  70.         cout<<d6<<endl;  
  71.         cout<<d7<<endl;  
  72.   
  73.         cout<<"---------------------------"<<endl;  
  74.         date today (2013,4,17);  
  75.         assert(today.year() == 2013);  
  76.         assert(today.month() == 4);  
  77.         assert(today.day() == 17);  
  78.   
  79.         date::ymd_type ymd = today.year_month_day();  
  80.         assert(ymd.year == 2013);  
  81.         assert(ymd.month == 4);  
  82.         assert(ymd.day == 17);  
  83.   
  84.         assert(today.day_of_week() == 3); //星期几 周日为0  
  85.         cout<<today.day_of_year()<<endl;    //在一年中是第几天  
  86.         assert(today.end_of_month() == date(2013,4,30));    //当月的最后一天  
  87.         cout<<today.week_number()<<endl;    //当年的第几周 范围0~53 年初的半周归为上一年,即53  
  88.         assert(d6.is_infinity());           //日期为无限日期  
  89.         assert(d6.is_neg_infinity());  
  90.         cout<<"---------------------------"<<endl;  
  91.   
  92.         cout<<to_simple_string(today)<<endl;  
  93.         cout<<to_iso_string(today)<<endl;         
  94.         cout<<to_iso_extended_string(today)<<endl;  //常用日期格式YYYY-MM-DD  
  95.         cout<<today<<endl;  
  96.       
  97.         cout<<"---------------------------"<<endl;  
  98.         tm t = to_tm(today);      
  99.         assert(t.tm_hour == 0 && t.tm_min == 0);  
  100.           
  101.         date new_today = date_from_tm(t);   //从tm转为date  
  102.         assert(new_today == today);  
  103.   
  104.         cout<<"-------------- days(date_duration) --------------"<<endl;  
  105.         days dd1(10),dd2(-20),dd3(365);  
  106.         assert(dd1>dd2 &&dd1<dd3);  
  107.         assert(dd1+dd2 == days(-10));  
  108.         assert((dd2+dd3).days() == 345);  
  109.         assert(dd3/5 == days(73));  
  110.   
  111.         weeks w(3);     //3个星期  
  112.         assert(w.days() == 21);  
  113.           
  114.         months m(5);  
  115.         years y(2);  
  116.   
  117.         months m2 = y+m;  
  118.         assert(m2.number_of_months() == 29);  
  119.         assert((y*2).number_of_years() == 4);  
  120.   
  121.         cout<<"-------------- Calc --------------"<<endl;  
  122.         date dA(2000,1,1),dB(2008,8,8);  
  123.         cout<<dB-dA<<endl;      //3142天  
  124.           
  125.         dA+=days(10);  
  126.         assert(dA.day() == 11);  
  127.         dA+=months(2);  
  128.         assert(dA.month() ==3 && dA.day()== 11);  
  129.   
  130.         dA-=weeks(1);  
  131.         assert(dA.day() == 4);  
  132.   
  133.         dB-=years(7);  
  134.         assert(dA.year() == dB.year()-1);  
  135.   
  136.         //如果日期是月末的最后一天,加减月或年会得到月末的时间,而不是简单的月、年加1  
  137.         date sp(2013,3,30);  
  138.         sp-=months(1);  
  139.         assert(sp.month() == 2 && sp.day() == 28);  
  140.         sp -=months(1);  
  141.         assert(sp.month()== 1 && sp.day()== 31);  
  142.         sp+=months(2);  
  143.         assert(sp.day() == 31); //与原来的日期已经不相等!  
  144.   
  145.         cout<<"-------------- date_period --------------"<<endl;  
  146.         date_period dp(date(2013,4,17),days(14));   //左开右闭与STL的容器相似  
  147.         assert(!dp.is_null());  
  148.         assert(dp.begin().day() == 17);  
  149.         assert(dp.last().day() == 30);  
  150.         assert(dp.end().day() == 1);  
  151.   
  152.         cout<<dp<<endl;  
  153.   
  154.         date_period new_dp = dp;  
  155.         new_dp.shift(days(3));      //将时间区间向后移动  
  156.         assert(new_dp.begin().day() == 20);  
  157.         assert(new_dp.length().days() == 14);  
  158.   
  159.           
  160.         new_dp.expand(days(3));     //区间两段延长n天,即延长2n天。  
  161.         assert(new_dp.begin().day() == 17);  
  162.         assert(new_dp.length().days() == 20);  
  163.   
  164.         assert(dp.is_after(date(2013,1,1)));  
  165.         assert(dp.contains(date(2013,4,20)));  
  166.   
  167.         date_period dp2 (date(2013,4,17),days(5));  
  168.         assert(dp.contains(dp2));  
  169.           
  170.         assert(dp.intersects(dp2));     //交集  
  171.         assert(dp.intersection(dp2) == dp2);  
  172.           
  173.         date_period dp3 (date(2013,5,1),days(5));  
  174.         assert(!dp3.intersects(dp));  
  175.         assert(dp3.intersection(dp2).is_null());  
  176.   
  177.         assert(dp.is_adjacent(dp3));  
  178.           
  179.         date_period dp4(date(2013,4,17),days(19)); //并集  
  180.         assert(dp.merge(dp3).is_null());    //无交集返回空  
  181.         assert(dp.span(dp3) == dp4);        //填充中间区域  
  182.   
  183.   
  184.         cout<<"-------------- date_iterator --------------"<<endl;  
  185.         date last(2013,4,17);  
  186.   
  187.         day_iterator d_iter(last);  //日期迭代器  
  188.   
  189.         assert(d_iter == last);  
  190.         ++d_iter;  
  191.         assert(d_iter == date(2013,4,18));  
  192.   
  193.         year_iterator y_iter(*d_iter,3);    //增减步长为3  
  194.         assert(y_iter == last + days(1));  
  195.   
  196.         ++y_iter;  
  197.         assert(y_iter->year() == 2016);  
  198.       
  199.         cout<<"-------------- func --------------"<<endl;  
  200.         cout<<(gregorian_calendar::is_leap_year(2000)? "Yes":"no")<<endl;   //闰年  
  201.         assert(gregorian_calendar::end_of_month_day(2013,2) == 28);     //月末天  
  202.           
  203.     }  
  204.       
  205.     {  
  206.         using namespace boost::posix_time;  
  207.         cout<<"-------------- time_duration --------------"<<endl;  
  208.         time_duration td(1,1,1);    //时、分、秒 会自动借、进位  
  209.         hours h0(1);  
  210.         minutes m(1);  
  211.         seconds s(1);  
  212.         millisec ms(1);  
  213.           
  214.         time_duration td2 = h0+m+s+ms;  
  215.         time_duration td3 = hours(2) + minutes(10);  
  216.         time_duration td4 = duration_from_string("1:10:10:300");  
  217.   
  218.         assert(td4.hours() == 1 && td4.minutes() == 10 && td4.seconds() == 10);   
  219.         assert(td.total_seconds() == 1*3600 + 1*60 +1); //转为sec  
  220.   
  221.         hours h(-10);  
  222.         assert(h.is_negative());  
  223.   
  224.         time_duration h2 = h.invert_sign(); //取反  
  225.         assert(!h2.is_negative() && h2.hours() == 10);  
  226.   
  227.         cout<<td3-td2<<endl;  
  228.         cout<<to_simple_string(td4)<<endl;  
  229.         cout<<to_iso_string(td4)<<endl;  
  230.           
  231.         cout<<"-------------- ptime --------------"<<endl;  
  232.         {  
  233.             using namespace boost::gregorian;  
  234.             ptime p(date(2013,4,17),hours(1));  //ptime相当于date+time_duration  
  235.             ptime p1 = time_from_string("2013-4-17 16:25:00");  
  236.             cout<<p<<endl;  
  237.             cout<<p1<<endl;  
  238.             ptime p2 = second_clock::local_time();          //常用时间输出  
  239.             ptime p3 = microsec_clock::universal_time();    //微秒精度  
  240.             cout<<p2<<endl<<p3<<endl;  
  241.   
  242.             ptime op(date(2013,4,17),hours(1)+minutes(30));  
  243.   
  244.             date d = op.date();  
  245.             time_duration optd = op.time_of_day();  
  246.             assert(d.day() == 17 && d.month() == 4);  
  247.             assert(optd.hours() == 1 && optd.minutes() == 30);  
  248.             cout<<to_iso_extended_string(op)<<endl;  
  249.   
  250.             tm t = to_tm(op);   //不可逆,此处与date不同  
  251.                                 //只能用date_from_tm先得到日期,再填充时间。  
  252.               
  253.             cout<<"-------------- time_period --------------"<<endl;  
  254.             time_period tp1 (op,hours(8));  
  255.             time_period tp2(op+hours(8),hours(1));  
  256.             assert(tp1.end() == tp2.begin() && tp1.is_adjacent(tp2));  
  257.             assert(!tp1.intersects(tp2));  
  258.   
  259.             tp1.shift(hours(1));  
  260.             assert(tp1.is_after(op));  
  261.             assert(tp1.intersects(tp2));  
  262.   
  263.             tp2.expand(hours(10));  
  264.             assert(tp2.contains(op) && tp2.contains(tp1));  
  265.   
  266.             cout<<"-------------- time_iterator --------------"<<endl;  
  267.             for (time_iterator t_iter(op,minutes(10));t_iter<op+hours(1);++t_iter)  
  268.             {  
  269.                 cout<<*t_iter<<endl;  
  270.             }  
  271.             cout<<"-------------- formate --------------"<<endl;  
  272.             date_facet* dfacet = new date_facet("%Y 年%m 月%d 日");  
  273.             cout.imbue(locale(cout.getloc(),dfacet));  
  274.             cout<<date(2013,4,17)<<endl;  
  275.   
  276.             time_facet* tfacet = new time_facet("%Y 年%m 月%d 日 %H点%M分%S%F秒");  
  277.             cout.imbue(locale(cout.getloc(),tfacet));  
  278.             cout<<op<<endl;  
  279.         }  
  280.     }  
  281.   
  282.     getchar();  
  283.     return 0;  
  284. }  
运行结果:

  1. Max 2.14748e+006  
  2. Min 0.001  
  3. elapsed: 0.001  
  4. elapsed: 0.1  
  5. ---------------------------  
  6. 0.30 s  
  7. ---------------------------  
  8. 0% 10 20 30 40 50 60 70 80 90 100%  
  9. |----|----|----|----|----|----|----|----|----|----|  
  10. ***************************************************  
  11. ---------------------------  
  12. ----------------- date ------------------  
  13. 2013-Apr-17  
  14. 2013-Apr-17  
  15. -infinity  
  16. +infinity  
  17. ---------------------------  
  18. 107  
  19. 16  
  20. ---------------------------  
  21. 2013-Apr-17  
  22. 20130417  
  23. 2013-04-17  
  24. 2013-Apr-17  
  25. ---------------------------  
  26. -------------- days(date_duration) --------------  
  27. -------------- Calc --------------  
  28. 3142  
  29. -------------- date_period --------------  
  30. [2013-Apr-17/2013-Apr-30]  
  31. -------------- date_iterator --------------  
  32. -------------- func --------------  
  33. Yes  
  34. -------------- time_duration --------------  
  35. 01:08:58.999000  
  36. 01:10:10.300000  
  37. 011010.300000  
  38. -------------- ptime --------------  
  39. 2013-Apr-17 01:00:00  
  40. 2013-Apr-17 16:25:00  
  41. 2013-Apr-17 17:19:21  
  42. 2013-Apr-17 09:19:21.870604  
  43. 2013-04-17T01:30:00  
  44. -------------- time_period --------------  
  45. -------------- time_iterator --------------  
  46. 2013-Apr-17 01:30:00  
  47. 2013-Apr-17 01:40:00  
  48. 2013-Apr-17 01:50:00  
  49. 2013-Apr-17 02:00:00  
  50. 2013-Apr-17 02:10:00  
  51. 2013-Apr-17 02:20:00  
  52. -------------- formate --------------  
  53. 2013 年04 月17 日  
  54. 2013 年04 月17 日 01点30分00秒 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值