Boost庫基礎-日期

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 <boost/date_time/gregorian/gregorian.hpp>
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 <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>

using namespace std;
using namespace boost;
using namespace boost::gregorian;

int main()
{
	date d(2020, 2, 22);

	//轉換爲YYYY-mmm-DD格式的字符串,mmm爲3字符英文月份名。
	cout << to_simple_string(d) << endl;

	//轉換爲YYYYMMDD格式
	cout << to_iso_string(d) << endl;

	//轉換爲YYYY-MM-DD格式
	cout << to_iso_extended_string(d) << endl;

	getchar();
	return 0;
}

運行截圖:

 

②日期長度

日期長度是以天爲單位的時長,是度量時間長度的一個標量。它與日期不同,值可以是任意的整數,可正可負。

用類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;                   //錯誤

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章