CLX C++ Libraries - date_time
Author: clown

CLX C++ Libraries
Home >> date_time

# Declaration

    template <class TimeZone>
    class basic_date_time;

    typedef basic_date_time<CLX_TZ_LOCAL> date_time;
    typedef basic_date_time<CLX_TZ_UTC> date_time_utc;

# Overview

C の struct tm をラップしたクラスです． boost::date_time を参考に演算子を定義しています．具体的には， 時刻 x の y 秒後を計算，2つの時刻 a，b の和・差を計算，2つの時刻 a，b の大小関係を比較する際に， + 演算子や - 演算子，比較演算子を用いて直感的に記述することができます．

時刻 x の z 時間後を計算したい場合には，対応する秒数を記述する代わりに x + clx::hours(z) と記述することができます．同様のクラス/関数として，years()，months()， days()，weeks()，hours()，minutes() を定義しています．詳細は， time_duration を参照して下さい．

尚，時刻の計算にはC 標準ライブラリの mktime() 関数を利用して計算しています．

# Example

example_date_time.cpp

    #include <iostream>
    #include "clx/format.h"
    #include "clx/time.h"

    int main(int argc, char* argv[]) {
        std::string fmt = "%a %d %b %Y %H:%M:%S JST";

        /*
         * 現在時刻の取得．
         * デフォルトコンストラクタは，現在時刻でdate_timeクラスを初期化する．
         */
        clx::date_time now;
        std::cout << now.to_string<char>(fmt) << std::endl;

        // 現在時刻から5年3ヶ月後の時刻を取得．
        clx::date_time t1 = now + clx::years(5) + clx::months(3);
        std::cout << "5 years 3 months later ... ";
        std::cout << t1.to_string<char>(fmt) << std::endl;

        std::cout << clx::format("%d days have passed since %d/01/01")
            % now.totaldays() % now.year() << std::endl;

        return 0;
    }

    Result
    Fri 02 Nov 2007 23:08:29 JST
    5 years 3 months later ... Sat 02 Feb 2013 23:08:29 JST
    305 days have passed since 2007/01/01

# Template Parameters

TimeZone
  どのタイムゾーンで日付・時刻を計算するのかを指定します．現在， CLX_TZ_LOCAL （実行するコンピュータのローカルタイムゾーン），CLX_TZ_UTC （UTC タイムゾーン）の 2 種類が定義されています．

# Related Types

    typedef unsigned int value_type;
    typedef std::tm tm_type;

# Constructions and Member Functions

    date_time();
    explicit basic_date_time(const tm_type& t);
    explicit basic_date_time(const std::time_t& t);
    explicit basic_date_time(value_type& y, value_type& m, value_type& d,
        value_type& h, value_type& mm, value_type& s);

    void reset();

    value_type year() const;
    value_type month() const;
    value_type day() const;
    value_type hour() const;
    value_type minute() const;
    value_type second() const;
    value_type totaldays() const;

コンストラクタには，std::time，および struct tm 構造体を指定することもできます． デフォルトコンストラクタ，もしくは reset() を呼び出した場合，現在時刻を基にして date_time クラスを初期化（再初期化）します．

    template <class CharT>
    basic_date_time& from_string(const CharT* s, const CharT* fmt);

    template <class CharT>
    basic_date_time& from_string(const std::basic_string<CharT>& s,
        const std::basic_string<CharT>& fmt = "%Y-%m-%dT%H:%M:%S");

    template <class CharT>
    std::basic_string<CharT> to_string(const CharT* fmt);

    template <class CharT>
    std::basic_string<CharT> to_string(
        const std::basic_string<CharT> fmt = "%Y-%m-%dT%H:%M:%S");

date_time <-> 文字列の相互変換を行うためのメソッド群です．どちらも fmt にしたがって文字列を解析/出力します．fmt を省略した場合，"yyyy-mm-ddTHH:MM:SS" と言う書式で文字列を解析/出力します．詳細については， date_time - string conversion を参照して下さい．

# Operators

    basic_date_time& operator=(const basic_date_time& t);
    basic_date_time& operator=(const tm_type& t);
    basic_date_time& operator=(const std::time_t& t);

    basic_date_time& operator+=(value_type t);
    basic_date_time& operator+=(const date_duration& t);
    basic_date_time& operator-=(value_type t);
    basic_date_time& operator-=(const date_duration& t);

    double operator-(const basic_date_time& t) const;
    double operator-(const std::time_t& t) const;
    double operator-(const std::tm& t) const;

    friend basic_date_time operator+(basic_date_time x, value_type y);
    friend basic_date_time operator+(basic_date_time x, const date_duration& y);
    friend basic_date_time operator-(basic_date_time x, value_type y)
    friend basic_date_time operator-(basic_date_time x, const date_duration& y);
    friend basic_date_time operator+(value_type y, basic_date_time x);
    friend basic_date_time operator+(const date_duration& y, basic_date_time x);
    friend basic_date_time operator-(value_type y, basic_date_time x);
    friend basic_date_time operator-(const date_duration& y, basic_date_time x);

    friend bool operator<(const basic_date_time& x, const basic_date_time& y);
    friend bool operator>(const basic_date_time& x, const basic_date_time& y);
    friend bool operator<=(const basic_date_time& x, const basic_date_time& y);
    friend bool operator>=(const basic_date_time& x, const basic_date_time& y);
    friend bool operator==(const basic_date_time& x, const basic_date_time& y);
    friend bool operator!=(const basic_date_time& x, const basic_date_time& y);

value_type は"秒"を表します．"年" や "時間" などの加減演算を行いたい場合は，clx::years()，clx::months()，clx::days()， clx::hours()，clx::minutes() の補助クラス/関数群を併用して下さい．

# Related Page

1. CLX C++ Libraries - date_time - string conversion
2. CLX C++ Libraries - time_duration

# References

1. Manpage of CTIME
2. Boost C++ Libraries - Boost Date_Time