datetime.hpp

# datetime.hpp #

TOMLの`datetime`で使用される、日時情報を保存するクラスを定義します。

# `enum class month_t` #

月を指定する`enum class`です。

`std::tm`との関係で、`local_date`は1月を`0`としています。 混乱を避けるため、月の名前で指定できるよう`month_t`が用意されています。

    namespace toml
    {
    enum class month_t : std::uint8_t
    {
        Jan =  0,
        Feb =  1,
        Mar =  2,
        Apr =  3,
        May =  4,
        Jun =  5,
        Jul =  6,
        Aug =  7,
        Sep =  8,
        Oct =  9,
        Nov = 10,
        Dec = 11
    };
    }

# `local_date` #

日付を保持する構造体です。

`year`は西暦を、`month`は`std::tm`との対応のため1月を`0`として、`day`は日付を保持します。

    namespace toml
    {
    struct local_date
    {
        std::int16_t year;
        std::uint8_t month;
        std::uint8_t day;

        local_date() = default;
        ~local_date() = default;
        local_date(local_date const&) = default;
        local_date(local_date&&)      = default;
        local_date& operator=(local_date const&) = default;
        local_date& operator=(local_date&&)      = default;

        local_date(int y, month_t m, int d);
        explicit local_date(const std::tm& t);
        explicit local_date(const std::chrono::system_clock::time_point& tp);
        explicit local_date(const std::time_t t);

        operator std::chrono::system_clock::time_point() const;
        operator std::time_t() const;
    };

    bool operator==(const local_date&, const local_date&);
    bool operator!=(const local_date&, const local_date&);
    bool operator< (const local_date&, const local_date&);
    bool operator<=(const local_date&, const local_date&);
    bool operator> (const local_date&, const local_date&);
    bool operator>=(const local_date&, const local_date&);

    std::ostream& operator<<(std::ostream& os, const local_date& date);
    std::string to_string(const local_date& date);
    }

## メンバ変数 #

### `year` #

    std::int16_t year;

西暦です。オフセットはありません。`2024`年は`2024`です。

### `month` #

    std::uint8_t month;

月を表します。`std::tm`との対応のため、1月は`0`, 2月は`1`と続きます。

混乱を避けるため、構築の際は`month_t`を使用します。

### `day` #

    std::uint8_t day;

日付を表します。1日は`1`です。

## メンバ関数 #

### コンストラクタ #

    local_date() = default;

デフォルト実装を使用します。

### デストラクタ #

    ~local_date() = default;

デフォルト実装を使用します。

### コピー・ムーブコンストラクタ #

    local_date(local_date const&) = default;
    local_date(local_date&&)      = default;

デフォルト実装を使用します。

### コピー・ムーブ代入演算子 #

    local_date& operator=(local_date const&) = default;
    local_date& operator=(local_date&&)      = default;

デフォルト実装を使用します。

### コンストラクタ(`int year, month_t month, int day`) #

    local_date(int y, month_t m, int d);

指定した値から`local_date`を構築します。

境界チェックなどは行いません。

### コンストラクタ(`std::tm`) #

    local_date(const std::tm&);

指定した値から`local_date`を構築します。

### コンストラクタ(`std::chrono::system_clock::time_point`) #

    local_date(const std::chrono::system_clock::time_point&);

指定した値から`local_date`を構築します。

タイムゾーンは実行環境でのものが選択されます。

### コンストラクタ(`std::time_t`) #

    local_date(const std::time_t);

指定した値から`local_date`を構築します。

タイムゾーンは実行環境でのものが選択されます。

### `operator std::chrono::system_clock::time_point` #

    operator std::chrono::system_clock::time_point() const;

`std::chrono::system_clock::time_point`に変換します。

タイムゾーンは実行環境でのものが選択されます。

時刻は0時00分とします。

### `operator std::time_t` #

    operator std::time_t() const;

`std::time_t`に変換します。

タイムゾーンは実行環境でのものが選択されます。

時刻は0時00分とします。

## 非メンバ関数 #

### 比較演算子 #

    bool operator==(const local_date&, const local_date&);
    bool operator!=(const local_date&, const local_date&);
    bool operator< (const local_date&, const local_date&);
    bool operator<=(const local_date&, const local_date&);
    bool operator> (const local_date&, const local_date&);
    bool operator>=(const local_date&, const local_date&);

日付の順序によって比較します。

### ストリーム出力演算子 #

    std::ostream& operator<<(std::ostream& os, const local_date& date);

TOMLのデフォルトのフォーマットで出力を行います。

### `to_string` #

    std::string to_string(const local_date& date);

TOMLのデフォルトのフォーマットで文字列化します。

# `local_time` #

    namespace toml
    {
    struct local_time
    {
        std::uint8_t  hour;        // [0, 23]
        std::uint8_t  minute;      // [0, 59]
        std::uint8_t  second;      // [0, 60]
        std::uint16_t millisecond; // [0, 999]
        std::uint16_t microsecond; // [0, 999]
        std::uint16_t nanosecond;  // [0, 999]

        local_time(int h, int m, int s, int ms = 0, int us = 0, int ns = 0);

        explicit local_time(const std::tm& t);

        template<typename Rep, typename Period>
        explicit local_time(const std::chrono::duration<Rep, Period>& t);

        operator std::chrono::nanoseconds() const;

        local_time() = default;
        ~local_time() = default;
        local_time(local_time const&) = default;
        local_time(local_time&&)      = default;
        local_time& operator=(local_time const&) = default;
        local_time& operator=(local_time&&)      = default;
    };

    bool operator==(const local_time& lhs, const local_time& rhs);
    bool operator!=(const local_time& lhs, const local_time& rhs);
    bool operator< (const local_time& lhs, const local_time& rhs);
    bool operator<=(const local_time& lhs, const local_time& rhs);
    bool operator> (const local_time& lhs, const local_time& rhs);
    bool operator>=(const local_time& lhs, const local_time& rhs);

    std::ostream& operator<<(std::ostream& os, const local_time& time);
    std::string to_string(const local_time& time);
    }

## メンバ変数 #

### `hour` #

    std::uint8_t  hour;

時間を表します。`0`から`23`の値を取ります。

### `minute` #

    std::uint8_t  minute;      // [0, 59]

分を表します。`0`から`59`の値を取ります。

### `second` #

    std::uint8_t  second;      // [0, 60]

秒を表します。`0`から`60`の値を取ります。

### `millisecond` #

    std::uint16_t millisecond; // [0, 999]

ミリ秒を表します。`0`から`999`の値を取ります。

### `microsecond` #

    std::uint16_t microsecond; // [0, 999]

マイクロ秒を表します。`0`から`999`の値を取ります。

### `nanosecond` #

    std::uint16_t nanosecond;  // [0, 999]

ナノ秒を表します。`0`から`999`の値を取ります。

## メンバ関数 #

### デフォルトコンストラクタ #

    local_time() = default;

全ての値を`0`で初期化します。

### コンストラクタ(h, m, s, ms = 0, us = 0, ns = 0) #

    local_time(int h, int m, int s, int ms = 0, int us = 0, int ns = 0);

指定された時刻を使って構築します。

境界チェックは行われません。

### コンストラクタ(`std::tm`) #

    explicit local_time(const std::tm& t);

`std::tm`の`tm_hour`, `tm_min`, `tm_sec`を使って構築します。

サブセコンドは全て`0`で初期化されます。

### コンストラクタ(`std::chrono::duration`) #

    template<typename Rep, typename Period>
    explicit local_time(const std::chrono::duration<Rep, Period>& t);

`duration`をその日の0時からの時間として構築します。

### `operator std::chrono::nanoseconds` #

    operator std::chrono::nanoseconds() const;

`std::chrono::nanoseconds`へ変換します。

## 非メンバ関数 #

### 比較演算子 #

    bool operator==(const local_time& lhs, const local_time& rhs);
    bool operator!=(const local_time& lhs, const local_time& rhs);
    bool operator< (const local_time& lhs, const local_time& rhs);
    bool operator<=(const local_time& lhs, const local_time& rhs);
    bool operator> (const local_time& lhs, const local_time& rhs);
    bool operator>=(const local_time& lhs, const local_time& rhs);

時刻の値によって比較を行います。

### ストリーム演算子 #

    std::ostream& operator<<(std::ostream& os, const local_time& time);

TOMLのデフォルトのフォーマットで出力を行います。

### `to_string` #

    std::string to_string(const local_time& time);

TOMLのデフォルトのフォーマットで文字列化します。

# `time_offset` #

    namespace toml
    {
    struct time_offset
    {
        std::int8_t hour{0};   // [-12, 12]
        std::int8_t minute{0}; // [-59, 59]

        time_offset(int h, int m);

        operator std::chrono::minutes() const;

        time_offset() = default;
        ~time_offset() = default;
        time_offset(time_offset const&) = default;
        time_offset(time_offset&&)      = default;
        time_offset& operator=(time_offset const&) = default;
        time_offset& operator=(time_offset&&)      = default;
    };

    bool operator==(const time_offset&, const time_offset&);
    bool operator!=(const time_offset&, const time_offset&);
    bool operator< (const time_offset&, const time_offset&);
    bool operator<=(const time_offset&, const time_offset&);
    bool operator> (const time_offset&, const time_offset&);
    bool operator>=(const time_offset&, const time_offset&);

    std::ostream& operator<<(std::ostream& os, const time_offset& offset);
    std::string to_string(const time_offset& offset);
    }

## メンバ変数 #

### `hour` #

    std::int8_t hour{0};   // [-12, 12]

時間のオフセットです。-12から+12の範囲の値を取ります。

### `minute` #

    std::int8_t minute{0}; // [-59, 59]

分のオフセットです。-59から+59の範囲の値を取ります。

## メンバ関数 #

### コンストラクタ #

    time_offset(int h, int m);

時間と分を取って構築します。

境界チェックは行いません。

### `operator std::chrono::minutes` #

    operator std::chrono::minutes() const;

`std::chrono::minutes`への変換を行います。

## 非メンバ関数 #

### 比較演算子 #

    bool operator==(const time_offset&, const time_offset&);
    bool operator!=(const time_offset&, const time_offset&);
    bool operator< (const time_offset&, const time_offset&);
    bool operator<=(const time_offset&, const time_offset&);
    bool operator> (const time_offset&, const time_offset&);
    bool operator>=(const time_offset&, const time_offset&);

時刻の長さで比較します。

### ストリーム出力演算子 #

    std::ostream& operator<<(std::ostream& os, const time_offset&);

TOMLのデフォルトのフォーマットで出力を行います。

### `to_string` #

    std::string to_string(const time_offset&);

TOMLのデフォルトのフォーマットで文字列化します。

# `local_datetime` #

    namespace toml
    {
    struct local_datetime
    {
        local_date date;
        local_time time;

        local_datetime(local_date d, local_time t);

        explicit local_datetime(const std::tm& t);
        explicit local_datetime(const std::chrono::system_clock::time_point& tp);
        explicit local_datetime(const std::time_t t);

        operator std::chrono::system_clock::time_point() const;
        operator std::time_t() const;

        local_datetime() = default;
        ~local_datetime() = default;
        local_datetime(local_datetime const&) = default;
        local_datetime(local_datetime&&)      = default;
        local_datetime& operator=(local_datetime const&) = default;
        local_datetime& operator=(local_datetime&&)      = default;
    };

    bool operator==(const local_datetime&, const local_datetime&);
    bool operator!=(const local_datetime&, const local_datetime&);
    bool operator< (const local_datetime&, const local_datetime&);
    bool operator<=(const local_datetime&, const local_datetime&);
    bool operator> (const local_datetime&, const local_datetime&);
    bool operator>=(const local_datetime&, const local_datetime&);

    std::ostream& operator<<(std::ostream& os, const local_datetime& dt);
    std::string to_string(const local_datetime& dt);
    }

## メンバ変数 #

### `local_date date` #

    local_date date;

日付部分のデータを保持します。

### `local_time time` #

    local_time time;

時刻部分のデータを保持します。

## メンバ関数 #

### デフォルトコンストラクタ #

`date`, `time`の双方をデフォルト構築します。

### コンストラクタ(`local_date, local_time`) #

指定された`date`と`time`で構築します。

### コンストラクタ(`std::tm`) #

`std::tm`から構築します。

タイムゾーンは実行環境でのものが選択されます。

### コンストラクタ(`std::chrono::system_clock::time_point`) #

`std::chrono::system_clock::time_point`から構築します。

タイムゾーンは実行環境でのものが選択されます。

### コンストラクタ(`std::time_t`) #

`std::time_t`から構築します。

タイムゾーンは実行環境でのものが選択されます。

### `operator std::chrono::system_clock::time_point` #

`std::chrono::system_clock::time_point`へ変換します。

### `operator std::time_t` #

`std::time_t`へ変換します。

## 非メンバ関数 #

### 比較演算子 #

    bool operator==(const local_datetime&, const local_datetime&);
    bool operator!=(const local_datetime&, const local_datetime&);
    bool operator< (const local_datetime&, const local_datetime&);
    bool operator<=(const local_datetime&, const local_datetime&);
    bool operator> (const local_datetime&, const local_datetime&);
    bool operator>=(const local_datetime&, const local_datetime&);

日付順で比較します。

### ストリーム出力演算子 #

    std::ostream& operator<<(std::ostream& os, const local_datetime&);

TOMLのデフォルトのフォーマットで出力を行います。

### `to_string` #

    std::string to_string(const local_datetime&);

TOMLのデフォルトのフォーマットで文字列化します。

# `offset_datetime` #

    namespace toml
    {
    struct offset_datetime
    {
        local_date  date;
        local_time  time;
        time_offset offset;

        offset_datetime(local_date d, local_time t, time_offset o);
        offset_datetime(const local_datetime& dt, time_offset o);
        explicit offset_datetime(const local_datetime& ld);
        explicit offset_datetime(const std::chrono::system_clock::time_point& tp);
        explicit offset_datetime(const std::time_t& t);
        explicit offset_datetime(const std::tm& t);

        operator std::chrono::system_clock::time_point() const;
        operator std::time_t() const;

        offset_datetime() = default;
        ~offset_datetime() = default;
        offset_datetime(offset_datetime const&) = default;
        offset_datetime(offset_datetime&&)      = default;
        offset_datetime& operator=(offset_datetime const&) = default;
        offset_datetime& operator=(offset_datetime&&)      = default;
    };

    bool operator==(const offset_datetime&, const offset_datetime&);
    bool operator!=(const offset_datetime&, const offset_datetime&);
    bool operator< (const offset_datetime&, const offset_datetime&);
    bool operator<=(const offset_datetime&, const offset_datetime&);
    bool operator> (const offset_datetime&, const offset_datetime&);
    bool operator>=(const offset_datetime&, const offset_datetime&);

    std::ostream& operator<<(std::ostream& os, const offset_datetime& dt);
    std::string to_string(const offset_datetime& dt);
    }

## メンバ変数 #

### `date` #

    local_date date;

日付部分のデータを保持します。

### `time` #

    local_time time;

時刻部分のデータを保持します。

### `offset` #

    time_offset offset;

オフセット部分のデータを保持します。

## メンバ関数 #

### デフォルトコンストラクタ #

`date`, `time`, `offset`を全てデフォルト構築します。

### コンストラクタ(`local_date, local_time, time_offset`) #

指定された`date`, `time`, `offset`で構築します。

### コンストラクタ(`local_datetime, time_offset`) #

`local_datetime`と`offset`から構築します。

### コンストラクタ(`std::tm`) #

`std::tm`から構築します。

タイムゾーンはUTC(00:00)になります。

### コンストラクタ(`std::chrono::system_clock::time_point`) #

`std::chrono::system_clock::time_point`から構築します。

タイムゾーンはUTC(00:00)になります。

### コンストラクタ(`std::time_t`) #

`std::time_t`から構築します。

タイムゾーンはUTC(00:00)になります。

### `operator std::chrono::system_clock::time_point` #

`std::chrono::system_clock::time_point`へ変換します。

タイムゾーンはUTC(00:00)になります。

### `operator std::time_t` #

`std::time_t`へ変換します。

タイムゾーンはUTC(00:00)になります。

## 非メンバ関数 #

### 比較演算子 #

    bool operator==(const offset_datetime&, const offset_datetime&);
    bool operator!=(const offset_datetime&, const offset_datetime&);
    bool operator< (const offset_datetime&, const offset_datetime&);
    bool operator<=(const offset_datetime&, const offset_datetime&);
    bool operator> (const offset_datetime&, const offset_datetime&);
    bool operator>=(const offset_datetime&, const offset_datetime&);

日付順で比較します。

同じ日付の場合、タイムゾーン順で比較されます。

### ストリーム出力演算子 #

    std::ostream& operator<<(std::ostream& os, const offset_datetime&);

TOMLのデフォルトのフォーマットで出力を行います。

### `to_string` #

    std::string to_string(const offset_datetime&);

TOMLのデフォルトのフォーマットで文字列化します。