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