天天看點

Boost 時間庫使用 筆記

最近學習了一下boost日期時間相關的庫,在此做一下學習筆記,來源于《Boost程式庫完全開發指南 第4版》

目錄

  • 思維導圖
  • date_time庫
    • 使用方式注意點
    • 頭檔案
    • 基本概念
  • 日期的處理
    • date類
  • 處理時間
    • 時間長度 time_duration
    • 時間點 ptime

Boost 時間庫使用 筆記

date_time庫 是需要編譯才能使用

Boost 時間庫使用 筆記

  • 處理日期的頭檔案 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為整數作為内部存儲,以天為機關表示時間點的概念
  • 類 思維導圖
    Boost 時間庫使用 筆記
  • 類摘要
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;
      ... 
};
           
  • 建立日期對象
  • 普通構造
    Boost 時間庫使用 筆記
  • 字元串構造 使用from_string() 或 from_undelimited_string()
    Boost 時間庫使用 筆記
  • day_clock
  • day_clock 是一個天級别的時鐘,調用其靜态成員函數local_day() 或universal_day()傳回當天的日期兌現。
  • day_clock 内部使用 C标準庫的localtime() 和 gmtime() 函數,是以local_day()結果依賴于作業系統的時區設定
    Boost 時間庫使用 筆記
  • 非法日期的處理-采用抛出異常的方式
  • 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()

    傳回 日
  • year_month_day()

    傳回 date::ymd_type結構
    Boost 時間庫使用 筆記
  • day_of_week()

    傳回 date 的星期數,0表示星期天 0~6
  • day_of_year()

    傳回 date 是當年的第幾天 最多366
  • end_of_month()

    傳回 當月最後一天的date
  • week_number()

    傳回date所在周是當年的第幾周 範圍0~53
  • 檢驗特殊日期的函數
  • is_infinity()

    是否是一個 無限日期
  • is_neg_infinity()

    是否是一個 負無限日期
  • is_pos_infinity()

    是否是一個 正無限日期
  • is_not_a_date()

    是否是一個無效日期 注意:非法日期沒辦法用這個檢測出來。非法日期在構造時就會抛出異常
  • is_special()

    是否是任意一個特殊日期
  • 例子:
    Boost 時間庫使用 筆記
  • 日期的輸出
  • to_simple_string()

    :YYYY-mmm-DD 其中mmm是3字元的英文月份名
  • to_iso_string()

    : YYYYMMDD 都為數字
  • to_iso_extended_string()

    : YYYY-MM-DD 都為數字
  • date支援 流輸入輸出,預設使用YYYY-mmm-DD格式
  • Boost 時間庫使用 筆記
  • 日期長度 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

    年機關時長類
  • 以上四個 支援加減 乘除運算
  • 用法例子:
    Boost 時間庫使用 筆記
  • 日期運算
  • 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相同