C++ boost 時間與日期處理詳細介紹
來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊: 次
boost 時間與日期處理
導視:
|
類
|
特點
|
缺點
|
說明 |
|
timer
|
計時基類
|
不適合大跨度時間
|
適用大部分的普通計時 |
|
progress_timer
|
繼承自timer 可以自動寫入流中
|
只精確到0.01s
|
如果需要更精確,可派生個類,調(diào)用stream的precision設置 |
| progress_display | 圖形化顯示進度 | 只能輸出到cout | 如果還有其他輸出則會干擾進度顯示。 折中的辦法是重新顯示 pd.restart(size); pd+= pNum; |
| date | 日期結構,時間點 | —— | date是date_time庫的核心類 boost::gregorian |
| date_duration | days、months、years 時間段 | —— | 表示一段時間,可以把它看成一個int |
| date_period | 標量,左開右閉,時間區(qū)間 | —— | 可以認為是一個有起點的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 | 時間區(qū)間 同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); //星期幾 周日為0
cout<<today.day_of_year()<<endl; //在一年中是第幾天
assert(today.end_of_month() == date(2013,4,30)); //當月的最后一天
cout<<today.week_number()<<endl; //當年的第幾周 范圍0~53 年初的半周歸為上一年,即53
assert(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-DD
cout<<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轉(zhuǎn)為date
assert(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);
//如果日期是月末的最后一天,加減月或年會得到月末的時間,而不是簡單的月、年加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); //與原來的日期已經(jīng)不相等!
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)); //將時間區(qū)間向后移動
assert(new_dp.begin().day() == 20);
assert(new_dp.length().days() == 14);
new_dp.expand(days(3)); //區(qū)間兩段延長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); //填充中間區(qū)域
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); //增減步長為3
assert(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); //轉(zhuǎn)為sec
hours 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_duration
ptime 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+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秒
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
欄 目:C語言
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1995.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關鍵字的使用詳解
- 01-10深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解
- 01-10深入線性時間復雜度求數(shù)組中第K大數(shù)的方法詳解


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10C#中split用法實例總結
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什


