1.date_time它是乙個非常全面且靈活的日期時間庫,基於我們日常使用的公曆,可以提供時間相關的各種所需功能,如精確定義的時間點、時間段和時間長度、加減若干天/月/年、日期迭代器等等,date_time庫還支援無限時間和無效時間這種實際生活中有用的概念,而且還可以與c的傳統時間結構tm相互轉換,提供向下支援。
date_time庫需要編譯才能使用,編譯方法。
date_time庫包含兩個部分,分別是處理日期的gregorian和處理時間的posix_time。
date_time庫中用列舉special_values定義了這些特殊的時間概念,它位於名字空間boost::date_time。
pos_infin //表示正無限
neg_infin //表示負無限
not_a_date_time //無效時間
min_date_time //可表示的最小日期或時間
max_date_time //可表示的最大日期或時間
①日期date是date_time庫處理日期的核心類,使用乙個32位的整數作為內部儲存,以天為單位表示時間點概念。
date是乙個輕量級的物件,很小,處理效率很高,可以被拷貝傳值,也全面支援比較操作和流輸入輸出。
//包含標頭檔案
#include using namespace boost::gregorian;
//建立日期的幾種方式
date d1;
date d2(2010, 1, 1);
date d3(2000, jan, 1);
date d4(d2);
//如果日期超過最大值或者小於最小值,則丟擲異常
date dd1(neg_infin); //負無限日期
date dd2(pos_infin); //正無限日期
date dd3(not_a_date_time); //無效日期
date dd4(max_date_time); //最大可能日期9999-12-31
date dd5(min_date_time); //最小可能日期1400-01-01
//做比較
assert(d1 == date(not_a_date_time));
assert(d2 == d4);
assert(d3 < d4);
//date也可以從乙個字串產生。
date d5 = from_string("1999-12-31");
date d6(from_string("2015/1/1"));
date d7 = from_undelimited_string("20011118");
//一些常用成員函式
date d(2014,4,1);
d.year();
d.month();
d.day();
d.day_of_week(); //返回date的星期數,0表示星期天
d.day_of_year(); //返回當年的第幾天(最多366)
d.end_of_month(); //返回當月的最後一天date物件。
d.week_number(); //返回date所在的週是當年的第幾周。
//檢驗日期的特殊方法
is_infinity(); //是否是乙個無限日期
is_neg_infinity(); //是否是乙個負無限日期
is_pos_infinity(); //是否是乙個正無限日期
is_not_a_date(); //是否是乙個無效日期
is_special(); //是否是任意乙個特殊日期
用法:
#include #include using namespace std;
using namespace boost;
using namespace boost::gregorian;
int main()
執行截圖:
②日期長度
日期長度是以天為單位的時長,是度量時間長度的乙個標量。它與日期不同,值可以是任意的整數,可正可負。
用類date_duration表示。
date_time庫為date_duration定義了乙個常用的typedef:days。
為了方便計算長度,date_time庫還提供了months、years、weeks等另外三個時長類,分別用來表示月、年和星期,它們的含義與days類似,但行為不太相同。
weeks w(3); //3個星期
months m(5); //5個月
years y(2); //2年
months m2 = y + m; //2年零5個月
③日期區間date_period類表示日期區間,它是時間軸上的乙個左閉右開區間,端點是兩個date物件。區間的左邊界必須小於右邊界,否則將表示乙個無效的日期區間。
date_period dp1(date(2014,1,1),days(20));
date_period dp1(date(2014,1,1),date(2013,1,1)); //無效
//常用方法
dp1.begin(); dp1.last(); //返回日期區間兩個端點
dp1.end(); //返回last()後的第一天。
dp1.length(); //返回日期區間的長度,以天為單位。
//區間價運算
dp1.shift(days(3)); //將日期區間平移n天而長度不變
dp1.expand(days(3)); //將日期區間向兩端延伸n天,相當於區間長度加2n天
④日期迭代器可以用簡單的遞增或者遞減操作符連續訪問日期,這些迭代器包括
day_iterator、week_iterator、month_iterator、year_iterator。
日期迭代器的用法基本類似,都需要在構造時傳入乙個起始日期和增減步長(可以是一天、兩周、n個月,預設是乙個單位)。然後用operator++、operator--變化日期,迭代器相當於乙個date物件的指標,可以用解引用操作符 * 獲得迭代器當前的日期物件,也可以用 -> 直接呼叫日期物件的成員函式。
date d(2016,11,26);
day_iterator d_iter(d); //預設步長為1天
++d_iter; //遞增1天,只有後置式,沒有前置式
year_iterator y_iter(*d_iter,8); //增減步長為8年
++y_iter; //遞增8年,只有後置式,沒有前置式
雖然day_iterator、week_iterator的名字叫 迭代器,但是它不符合標準迭代器的定義,不能使用operator+=來前進或者後退。
date d(2016,11,26);
day_iterator d_iter(d); //預設步長為1天
++d_iter; //遞增1天,只有後置式,沒有前置式
d_iter += 5; //錯誤
Boost庫基礎 時間
posix time類 date time庫在格里高利曆的基礎上提供微秒級別的時間系統,但如果需要,它最高可以達到納秒級別的精確度。用它需要包含以下標頭檔案 include using namespace boost posix time 1.時間長度 與日期長度date duration類似,使用...
Boost庫時間日期學習
學習內容見 boost程式庫完全開發指南 第2章 時間與日期 學習三個類的使用timer progress timer date。boost庫的配置可參照 開發環境 winxp vs2005 boost 1 49 0。以下所有示例程式均為控制台程式。1 timer類 timer類是乙個小型的計時器,...
boost 日期與時間相關庫
1.timer類 include stdafx.h include include using namespace std using namespace boost int tmain int argc,tchar argv 2.boost progress timer t類 自動列印輸出流逝的時...