最近學習了一下boost日期時間相關的庫,在此做一下學習筆記,來源于《Boost程式庫完全開發指南 第4版》
目錄
- 思維導圖
- date_time庫
- 使用方式注意點
- 頭檔案
- 基本概念
- 日期的處理
- date類
- 處理時間
- 時間長度 time_duration
- 時間點 ptime
date_time庫 是需要編譯才能使用
- 處理日期的頭檔案 gregorian
// 處理日期的元件
#include <boost/date_time/gregorian/gregorian.hpp>
using namesapce boost::gregorian;
- 處理時間的頭檔案 posix_time
// 處理時間的元件
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time
- 時間是個無限延伸的實數軸,時間點是數軸上的點,兩個時間點确定一個區間,時長(時間長度)是一個有正負号的标量,是兩個時間點之差,不屬于數軸
- 時間點、時間段和時長可以進行一定的運算,可以用常識想到 “時間點 + 時長 = 時間點” ,“時長 + 時長 = 時長”,“時間段 ∩ 時間段 = 時間段”,“時間點 ∈ 時間段” ; 還有一些無意義的運算如 “時間點+時間點”、“時長+時間段”
- date_time 支援 無限時間和無效時間,這樣特殊的時間,類似于數學上的極限。這樣的 special_values 有如下幾個
-
: 表示正無限pos_infin
-
: 表示負無限neg_infin
-
: 無效時間not_a_date_time
-
: 可表示的最小日期或時間min_date_time
-
: 可表示的最大日期或時間max_date_time
- date_time 是日期的處理部分 ,日期隻涉及 年月日。
- date_time 僅支援1400-01-01到9999-12-31之間的日期計算
- date 是date_time處理 日期的核心類,使用一個32為整數作為内部存儲,以天為機關表示時間點的概念
- 類 思維導圖
- 類摘要
templat<typename T, typename calendar, typename duration_type_>
class date{
public:
date(year_type,month_type,date_type); // 構造函數 如 date(2021,1,1)
date(const ymd_type &);// 其他類型的構造函數
// 基本操作函數
year_type year() const; // 擷取 年
month_type month() const; // 擷取 月
day_type day() const; // 擷取 日
day_of_week_type day_of_week() const;// 擷取 當天的星期數
ymd_type year_month_day() const;
bool operator<(const date_type &) const;
bool operator==(const date_type &) const;
// 校驗函數
bool is_special() const;
bool is_not_a_date() const;
bool is_infinity() const;
bool is_pos_infinity() const;
bool is_neg_infinity() const;
// 日期運算函數
duration_type operator-(const date_tye &) const;
...
};
- 建立日期對象
- 普通構造
- 字元串構造 使用from_string() 或 from_undelimited_string()
- day_clock
- day_clock 是一個天級别的時鐘,調用其靜态成員函數local_day() 或universal_day()傳回當天的日期兌現。
- day_clock 内部使用 C标準庫的localtime() 和 gmtime() 函數,是以local_day()結果依賴于作業系統的時區設定
- 非法日期的處理-采用抛出異常的方式
- 1.日期超出1400-01-01到9999-12-31的範圍
- 2.使用不存在的月份或日期 如 date(2020,2,30) date(2021,13,1)
- date_time庫會抛出異常(不會轉換為一個無效日期),使用what()可以獲得具體錯誤資訊
- 日期通路函數
-
傳回 年date.year()
-
傳回 月date.month()
-
傳回 日date.day()
-
傳回 date::ymd_type結構year_month_day()
-
傳回 date 的星期數,0表示星期天 0~6day_of_week()
-
傳回 date 是當年的第幾天 最多366day_of_year()
-
傳回 當月最後一天的dateend_of_month()
-
傳回date所在周是當年的第幾周 範圍0~53week_number()
- 檢驗特殊日期的函數
-
是否是一個 無限日期is_infinity()
-
是否是一個 負無限日期is_neg_infinity()
-
是否是一個 正無限日期is_pos_infinity()
-
是否是一個無效日期 注意:非法日期沒辦法用這個檢測出來。非法日期在構造時就會抛出異常is_not_a_date()
-
是否是任意一個特殊日期is_special()
- 例子:
- 日期的輸出
-
:YYYY-mmm-DD 其中mmm是3字元的英文月份名to_simple_string()
-
: YYYYMMDD 都為數字to_iso_string()
-
: YYYY-MM-DD 都為數字to_iso_extended_string()
- date支援 流輸入輸出,預設使用YYYY-mmm-DD格式
- 日期長度 date_duration
class date_duration
{
public:
date_duration(long); //構造函數
date_duration(special_values);
long days() const; // 成員通路函數
bool is_special() const;
bool is_negative() const;
bool operator==(const date_duration &) const;
...
static date_duration unit(); // 時長機關
};
-
天機關時長類days
-
周機關時長類weeks
-
月機關時長類months
-
年機關時長類years
- 以上四個 支援加減 乘除運算
- 用法例子:
- 日期運算
- days = date1 - date2
- date1 = date + days(x) : x天間隔
- date1 = date + weeks(x) : x個周間隔
- date1 = date + months(x) : x個月間隔 注意:如果是月末日期,可能加減之後會丢失 日期。如1月31号加一個月會得到 2月28号 或 29号,再 加一個月 隻能得到 3月 28号 或 29号
-
date1 = date + years(x) : x個年間隔 年也可能有月類似問題。當出現 閏年的 2月 29号
以上 x 值可以為負數
- 時間 是 日期的進一步細化,相當于在日期“天”的量級下增加時分秒。
- time_duration 和 date_duration 類似。可以說是對時長機關的細化
-
小時hours
-
分minutes
-
秒seconds
-
毫秒milliseconds
-
微秒microseconds
-
納秒nanoseconds
- 運算上 和 date_duration 運算類似
- ptime 類摘要
class ptime
{
public:
ptime(const date_type &,const time_duration_type &, dast_flags = not_dst); // 構造函數
ptime(special_values)
date_type date() const; //擷取日期
time_duration_type time_of_day() const; // 擷取時間
// 其他函數 與 date類 類似
};
- 建立時間點對象
- ptime(date(2021,1,1),hours(1)) // 2021年1月1号 淩晨 1時
- 實際上 時間點對象 就是 date+time_duration
- 時間運算
- ptime 除了days、weeks、months、years 增加了 hours、minutes、seconds、milliseconds...等待時長機關
- 運算上 和 date相同