Program Listing for File Date.h

Return to documentation for file (axr.sdk/Date.h)

#pragma once

#include <cpprest/details/basic_types.h>

namespace axr {
namespace sdk {

class datetime
{
public:
    typedef uint64_t interval_type;

    enum date_format
    {
        RFC_1123,
        ISO_8601
    };

    static _ASYNCRTIMP datetime __cdecl utc_now();

    enum : interval_type
    {
        utc_timestamp_invalid = static_cast<interval_type>(-1)
    };

    static interval_type utc_timestamp()
    {
        const auto seconds = utc_now().to_interval() / _secondTicks;
        if (seconds >= 11644473600LL)
        {
            return seconds - 11644473600LL;
        }
        else
        {
            return utc_timestamp_invalid;
        }
    }

    datetime() : m_interval(0) { }

    static _ASYNCRTIMP datetime __cdecl from_string(const utility::string_t& timestring, date_format format = RFC_1123);

    static _ASYNCRTIMP datetime __cdecl from_string_maximum_error(const utility::string_t& timestring,
        date_format format = RFC_1123);

    _ASYNCRTIMP utility::string_t to_string(date_format format = RFC_1123) const;

    interval_type to_interval() const { return m_interval; }

    static datetime from_interval(interval_type interval) { return datetime(interval); }

    datetime operator-(interval_type value) const { return datetime(m_interval - value); }

    datetime operator+(interval_type value) const { return datetime(m_interval + value); }

    bool operator==(datetime dt) const { return m_interval == dt.m_interval; }

    bool operator!=(const datetime& dt) const { return !(*this == dt); }

    bool operator>(const datetime& dt) const { return this->m_interval > dt.m_interval; }

    bool operator<(const datetime& dt) const { return this->m_interval < dt.m_interval; }

    bool operator>=(const datetime& dt) const { return this->m_interval >= dt.m_interval; }

    bool operator<=(const datetime& dt) const { return this->m_interval <= dt.m_interval; }

    static interval_type from_milliseconds(unsigned int milliseconds) { return milliseconds * _msTicks; }

    static interval_type from_seconds(unsigned int seconds) { return seconds * _secondTicks; }

    static interval_type from_minutes(unsigned int minutes) { return minutes * _minuteTicks; }

    static interval_type from_hours(unsigned int hours) { return hours * _hourTicks; }

    static interval_type from_days(unsigned int days) { return days * _dayTicks; }

    bool is_initialized() const { return m_interval != 0; }

    static datetime maximum() { return datetime(static_cast<interval_type>(-1)); }

private:
    friend int operator-(datetime t1, datetime t2);

    static const interval_type _msTicks = static_cast<interval_type>(10000);
    static const interval_type _secondTicks = 1000 * _msTicks;
    static const interval_type _minuteTicks = 60 * _secondTicks;
    static const interval_type _hourTicks = 60 * 60 * _secondTicks;
    static const interval_type _dayTicks = 24 * 60 * 60 * _secondTicks;

    // Private constructor. Use static methods to create an instance.
    datetime(interval_type interval) : m_interval(interval) { }

    // Storing as hundreds of nanoseconds 10e-7, i.e. 1 here equals 100ns.
    interval_type m_interval;
};

inline int operator-(datetime t1, datetime t2)
{
    auto diff = (t1.m_interval - t2.m_interval);

    // Round it down to seconds
    diff /= 10 * 1000 * 1000;

    return static_cast<int>(diff);
}

} // namespace sdk
} // namespace axr