Boost庫基礎 時間

2021-10-04 06:17:03 字數 4078 閱讀 1944

posix_time類

date_time庫在格里高利曆的基礎上提供微秒級別的時間系統,但如果需要,它最高可以達到納秒級別的精確度。

用它需要包含以下標頭檔案

#include 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_******_string(time_duration);

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));    //2023年6月8日凌晨1時

ptime p1 = time_from_string("2014-6-8 01:00:00"); //2023年6月8日凌晨1時

ptime p2 = from_iso_string("20140608t010000"); //2023年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)

Boost庫基礎 日期

1.date time 它是乙個非常全面且靈活的日期時間庫,基於我們日常使用的公曆,可以提供時間相關的各種所需功能,如精確定義的時間點 時間段和時間長度 加減若干天 月 年 日期迭代器等等,date time庫還支援無限時間和無效時間這種實際生活中有用的概念,而且還可以與c的傳統時間結構tm相互轉換...

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