Boost庫基礎 日期

2021-10-04 03:38:57 字數 4090 閱讀 6575

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類 自動列印輸出流逝的時...