posix_time類
date_time庫在格里高利曆的基礎上提供微秒級別的時間系統,但如果需要,它最高可以達到納秒級別的精確度。
用它需要包含以下頭文件
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time;
1.時間長度
與日期長度date_duration類似,使用time_duration度量時間長度。
它可以精確到微秒,如果需要精確到納秒,則需要定義宏BOOST_DATE_POSIX_TIME_STD_CONFIG。
time_duration有幾個子類,可以度量不同的時間分辨率,分別是:
hours、minutes、seconds、millisec/milliseconds、microsec/microseconds和nanosec/nanoseconds。
time_duration支持全序比較操作和輸入輸出,而且比date_duration要支持更多的算術運算,可以進行加減乘除運算。
//基本創建
//創建一個1小時10分30秒1毫秒(1000微秒)的時間長度
time_duration td(1,10,30,1000);
//時、分、秒等值可以是任意的數量,不一定必須在它們的限度裏,超出的時間會自動進位或借位
//例如,下面表示2小時01分06.001秒
time_duration td(1,60,60,1000*1000*6+1000);
//使用time_duration的子類可以直觀的創建時間長度
hours h(1); //1小時
minutes m(10); //10分鐘
seconds s(30); //30秒鐘
millisec ms(1); //1毫秒
time_duration td = h + m + s + ms; //可以賦值給time_duration
time_duration td2 = hours(2) + seconds(10); //也可以直接賦值
//time_duration也可以從一個字符串創建
time_duration td = duration_from_string("1:10:30:001");
//time_duration裏的時分秒可以用hours()、minutes()、seconds()成員函數訪問
time_duration td(1,10,30,1000);
td.hours();
td.minutes();
td.seconds();
td.total_seconds(); //返回時間長度總秒數
td.total_milliseconds(); //返回時間長度總毫秒數
td.total_microseconds(); //返回時間長度總微秒數
//time_duration可以取負值,專門有一個成員函數判斷它的正負號
hours h(-1);
h.is_negative();
h.invert_sign(); //將時間長度改變符號後生成一個新的時間長度
//時間長度用字符串表示
to_simple_string(time_duration); //HH:MM:SS.fffffffff
to_iso_string(time_duration); //HHMMSS,fffffffff
2.時間長度精確度
默認精確到微秒,納秒相關的類和函數 nanosec和成員函數nanoseconds()、total_nanoseconds()都不可用。
如果需要精確到納秒,則需要定義宏BOOST_DATE_POSIX_TIME_STD_CONFIG。
定義宏之後,構造函數會發生一些變化,秒以下的時間度量單位也會變成納秒。
#define BOOST_DATE_POSIX_TIME_STD_CONFIG
time_duration td(1,10,30,1000); //1000納秒,即1微秒
//靜態成員函數unit()返回一個time_duration對象,它是time_duration計量
//的最小單位,相當於time_duration(0,0,0,1);默認是微秒,定義了上面宏,則是納秒
time_duration::unit() * 1000 * 1000 * 1000 //1秒等於10的9次方納秒
time_duration::resolution(); //返回時間長度的分辨率,是個枚舉值。
time_duration::num_fractional_digits(); //返回秒的小數部分的位數(微秒6位,納秒9位)
3.時間點
相當於一個日期加上一個小於一天的時間長度。我們使用ptime類處理。
ptime p(date(2014,6,8),hours(1)); //2014年6月8日凌晨1時
ptime p1 = time_from_string("2014-6-8 01:00:00"); //2014年6月8日凌晨1時
ptime p2 = from_iso_string("20140608T010000"); //2014年6月8日凌晨1時
date_time庫爲ptime也提供了時鐘類,也可以從時鐘產生當前時間,分別是second_clock和microsec_clock類,分別提供秒級和微秒級的分辨率。local_time()獲得本地當前時間,universal_time()獲得UTC()當前時間
ptime p1 = second_clock::local_time();
ptime p2 = microsec_clock::universal_time();
4.操作時間點對象
由於ptime相當於date + time_duration,因此對它的操作可以分解爲對這兩個組成部分的操作
使用date()和time_of_day()兩個成員函數獲得時間點中的日期和時間長度。
ptime p(date(2010,3,20),hours(12) + minutes(30));
date d = p.date();
time_duration td = p.time_of_day();
5.時間區間
與日期區間date_period對應,叫做time_period,使用ptime作爲區間的兩個端點,同樣是左閉右開的區間。
用法與date_period基本相同,可以用begin()和last()返回區間的兩個端點,length()返回區間的長度,shift()和expand()變動區間。
ptime p(date(2014,1,1),hours(12));
//一個8小時的區間
time_period tp1(p,hours(8));
//一小時的區間
time_period tp2(p + hours(8),hours(1));
//平移1小時
tp1.shift(hours(1));
//向兩端擴展10個小時
tp2.expand(hours(10));
6.時間迭代器
不同於日期迭代器,時間迭代器只有一個time_iterator,它在構造時傳入一個起始時間點ptime對象和一個步長time_duration對象,然後就同日期迭代器一樣使用前置式operator++、operator--來遞增時間或遞減時間,解引用返回一個ptime對象。
ptime p(date(2014,11,3),hours(10));
for(time_iterator t_iter(p,minutes(10));t_iter < p + hours(1); ++t_iter)
{
cout<< *t_iter <<endl;
}