Boost庫基礎-時間

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;
}

 

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