/*
 * (C) Copyright 1996-2013 ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 * In applying this licence, ECMWF does not waive the privileges and immunities
 * granted to it by virtue of its status as an intergovernmental organisation nor
 * does it submit to any jurisdiction.
 */

// Baudouin Raoult - ECMWF Sep 96

#ifndef eckit_DateTime_h
#define eckit_DateTime_h


#include "Date.h"
#include "Time.h"

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

class DateTime {
public:
    // Contructors

    DateTime(time_t = ::time(0));
    DateTime(const Date&, const Time&);
    DateTime(const std::string&);
    DateTime(double);


    ~DateTime() {}

    bool operator<(const DateTime& other) const { return (date_ == other.date_)
                                                             ? (time_ < other.time_)
                                                             : (date_ < other.date_); }

    bool operator==(const DateTime& other) const { return (date_ == other.date_) && (time_ == other.time_); }

    bool operator!=(const DateTime& other) const { return (date_ != other.date_) || (time_ != other.time_); }

    bool operator>(const DateTime& other) const { return (date_ == other.date_)
                                                             ? (time_ > other.time_)
                                                             : (date_ > other.date_); }

    bool operator>=(const DateTime& other) const { return !(*this < other); }

    bool operator<=(const DateTime& other) const { return !(*this > other); }

    DateTime& operator=(const DateTime&);

    Second operator-(const DateTime&) const;
    DateTime operator+(const Second&) const;

    operator std::string() const;

    const Date& date() const { return date_; }
    const Time& time() const { return time_; }

    DateTime round(const Second& seconds) const;

    // void dump(DumpLoad&) const;
    // void load(DumpLoad&);

    std::string format(const std::string& fmt);

    std::string iso(bool UTC = true) const;

protected:  // members
    Date date_;
    Time time_;

private:  // methods
    void print(std::ostream&) const;

    friend std::ostream& operator<<(std::ostream& s, const DateTime& p) {
        p.print(s);
        return s;
    }
};


//-----------------------------------------------------------------------------


#endif
