3 #ifndef INCLUDE_NN_NLIB_DATETIME_H_
4 #define INCLUDE_NN_NLIB_DATETIME_H_
8 #ifdef NLIB_CXX11_STDLIB_CHRONO
18 NLIB_EINVAL_IFNULL(t);
23 *t = time / 10000 - (10957LL * 24LL * 60LL * 60LL * 1000LL);
31 return static_cast<uint64_t
>(t / 10000);
50 if (tick < 0) tick = -tick;
60 return lhs.tick == rhs.tick;
63 return lhs.tick < rhs.tick;
91 NLIB_CEXPR const int64_t tick_1d = (10LL * 1000 * 1000 * 60 * 60 * 24);
98 : m_Value(static_cast<int64_t>(days) * tick_1d) {}
100 : m_Value(days* tick_1d + seconds*(10LL * 1000 * 1000)) {}
104 : m_Value(days* tick_1d + seconds*(10LL * 1000 * 1000) + milliseconds*(10LL * 1000) +
105 microseconds * 10LL) {}
112 return static_cast<int>(m_Value.tick / (10LL * 1000 * 1000 * 60 * 60 * 24));
115 return static_cast<int>(m_Value.tick / (10LL * 1000 * 1000 * 60 * 60));
118 return m_Value.tick / (10 * 1000 * 1000 * 60);
121 return m_Value.tick / (10 * 1000 * 1000);
124 return m_Value.tick / (10 * 1000);
127 return m_Value.tick / (10);
129 #ifdef NLIB_HAS_STDHEADER_TIME
130 template <
class TIMEVAL>
131 void ToTimeVal(TIMEVAL* tv)
const NLIB_NOEXCEPT {
132 int64_t usec = ToMicroSeconds();
133 int64_t sec = usec / (1000 * 1000);
134 tv->tv_sec =
static_cast<time_t
>(sec);
135 tv->tv_usec =
static_cast<int32_t
>(usec - sec * (1000 * 1000));
137 template <
class TIMESPEC>
138 void ToTimeSpec(TIMESPEC* tp)
const NLIB_NOEXCEPT {
139 int64_t usec = ToMicroSeconds();
140 int64_t sec = usec / (1000 * 1000);
141 tp->tv_sec =
static_cast<time_t
>(sec);
142 tp->tv_nsec =
static_cast<long>(usec - sec * (1000 * 1000)) * 1000;
145 #ifdef NLIB_CXX11_STDLIB_CHRONO
146 template <
class Rep,
class Period>
147 TimeSpan(
const std::chrono::duration<Rep, Period>& rhs) {
148 auto tmp = std::chrono::duration_cast<std::chrono::microseconds>(rhs);
153 auto tmp = std::chrono::microseconds(m_Value.tick / 10);
154 return std::chrono::duration_cast<T>(tmp);
160 m_Value += rhs.m_Value;
164 m_Value -= rhs.m_Value;
172 m_Value.tick =
static_cast<int64_t
>(m_Value.tick * d);
175 void Abs() NLIB_NOEXCEPT { m_Value.Abs(); }
179 return m_Value == rhs.m_Value;
182 return m_Value != rhs.m_Value;
185 return m_Value < rhs.m_Value;
188 return m_Value > rhs.m_Value;
191 return m_Value <= rhs.m_Value;
194 return m_Value >= rhs.m_Value;
267 int min = 0,
int sec = 0,
int msec = 0,
268 int usec = 0) NLIB_NOEXCEPT;
273 return IsValid() ? 0 : EINVAL;
324 bool operator==(const DateTime& rhs) const NLIB_NOEXCEPT {
325 return m_Value == rhs.m_Value;
328 return m_Value != rhs.m_Value;
331 return m_Value < rhs.m_Value;
334 return m_Value > rhs.m_Value;
337 return m_Value <= rhs.m_Value;
340 return m_Value >= rhs.m_Value;
343 #ifdef NLIB_CXX11_STDLIB_CHRONO
344 template <
class Clock,
class Duration>
345 errno_t Init(
const std::chrono::time_point<Clock, Duration>& rhs) {
346 auto tmp = std::chrono::duration_cast<std::chrono::microseconds>(rhs.time_since_epoch());
352 auto tmp = std::chrono::microseconds(m_Value.tick / 10);
359 return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
373 return this->Init(rhs.year, rhs.month, rhs.day, rhs.hour, rhs.min, rhs.sec, rhs.msec, rhs.usec);
377 m_Value += rhs.ToTimeValue();
378 return IsValid() ? 0 : ERANGE;
381 inline errno_t DateTime::AddDays(
double value) NLIB_NOEXCEPT {
387 inline errno_t DateTime::AddHours(
double value) NLIB_NOEXCEPT {
393 inline errno_t DateTime::AddMinutes(
double value) NLIB_NOEXCEPT {
399 inline errno_t DateTime::AddSeconds(
double value) NLIB_NOEXCEPT {
405 inline errno_t DateTime::AddMilliSeconds(
double value) NLIB_NOEXCEPT {
411 inline errno_t DateTime::AddMicroSeconds(
double value) NLIB_NOEXCEPT {
440 return TimeSpan(lhs.ToTimeValue() - rhs.ToTimeValue());
445 #endif // INCLUDE_NN_NLIB_DATETIME_H_
bool operator<(const TimeValue &lhs, const TimeValue &rhs) noexcept
比較演算子です。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
int64_t tick
nlib_time, nlib_durationとして利用することができます。
TimeSpan & operator*=(int i) noexcept
時間をi で乗算します。
TimeSpan & operator-=(const TimeSpan &rhs) noexcept
時間を減算します。
bool operator==(const TimeSpan &rhs) const noexcept
同じ時間ならばtrueを返します。
static bool IsLeapYear(int year) noexcept
閏年かどうかをチェックします。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
#define NLIB_SAFE_BOOL(class_name, exp)
クラス内に安全なoperator bool()を定義します。 可能であればC++11のexplicit boolを利用します。 ...
errno_t ToW3cDtf(char(&str)[32]) const noexcept
ToW3cDtf(str, TimeSpan()) を呼び出します。
bool operator<(const TimeSpan &rhs) const noexcept
rhs より小さければtrueを返します。
TimeSpan operator-() const noexcept
単項演算子です。
int64_t ToMinutes() const noexcept
時間を分数にして返します。端数は切り捨てられます。
TimeSpan & operator+=(const TimeSpan &rhs) noexcept
時間を加算します。
errno_t ToRfc2822(char(&str)[32]) const noexcept
ToRfc2822(str, TimeSpan()) を呼び出します。
bool operator<=(const TimeSpan &rhs) const noexcept
rhs と同じかより小さければtrueを返します。
TimeSpan operator*(const TimeSpan &lhs, double d) noexcept
rhs を d 倍します。
bool operator<=(const TimeValue &lhs, const TimeValue &rhs) noexcept
比較演算子です。
int64_t ToSeconds() const noexcept
時間を秒数にして返します。端数は切り捨てられます。
bool operator==(const HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価ならば、trueを返します。
bool operator!=(const HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価でなければ、trueを返します。
bool operator<=(const DateTime &rhs) const noexcept
rhs と同じかより過去の時刻ならtrueを返します。
DateTime operator+(const DateTime &lhs, const TimeSpan &rhs) noexcept
lhs から rhs だけ未来の時刻を返します。
uint64_t GetTickTime() noexcept
システムを起動した後の経過時間をミリ秒単位で返します。
constexpr TimeSpan() noexcept
時間を 0 で初期化するコンストラクタです。
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
日時情報をDateTimeに設定したりDateTimeから取得するための構造体です。
TimeSpan operator-(const DateTime &lhs, const DateTime &rhs) noexcept
時刻rhs から時刻lhs までの時間を返します。
errno_t GetNintendoTime(int64_t *t) noexcept
2000/01/01を起点とした経過時間をミリ秒単位で返します。
bool operator>=(const TimeValue &lhs, const TimeValue &rhs) noexcept
比較演算子です。
bool operator>=(const DateTime &rhs) const noexcept
rhs と同じかより未来の時刻ならtrueを返します。
int ToDays() const noexcept
時間を日数にして返します。端数は切り捨てられます。
TimeValue operator-() const noexcept
単項演算子です。
TimeValue ToTimeValue() const noexcept
TimeValueオブジェクトを返します。
bool operator>(const TimeValue &lhs, const TimeValue &rhs) noexcept
比較演算子です。
constexpr TimeSpan(int days) noexcept
期間として日数を指定して初期化します。
TimeSpan operator+() const noexcept
単項演算子です。
TimeValue ToTimeValue() const noexcept
TimeValueオブジェクトに変換します。
int64_t ToMicroSeconds() const noexcept
時間をマイクロ秒数にして返します。端数は切り捨てられます。
bool operator>=(const TimeSpan &rhs) const noexcept
rhs と同じかより大きければtrueを返します。
int64_t ToMilliSeconds() const noexcept
時間をミリ秒数にして返します。端数は切り捨てられます。
TimeSpan(const TimeValue &rhs) noexcept
TimeValue オブジェクトを用いて初期化します。
constexpr DateTime() noexcept
デフォルトコンストラクタです。無効な時刻で初期化します。
bool operator<(const DateTime &rhs) const noexcept
rhs より過去の時刻ならtrueを返します。
constexpr TimeSpan(int days, int seconds) noexcept
期間として日数と秒を指定して初期化します。
constexpr TimeValue() noexcept
デフォルトコンストラクタです。
bool operator>(const TimeSpan &rhs) const noexcept
rhs より大きければtrueを返します。
constexpr TimeValue(int64_t tick_) noexcept
nlib_time, nlib_durationの値を引数にして初期化します。
bool operator!=(const TimeSpan &rhs) const noexcept
異なる時間ならばtrueを返します。
TimeSpan & operator*=(double d) noexcept
時間をd で乗算します。
int ToHours() const noexcept
時間を一時間単位の値として返します。端数は切り捨てられます。
constexpr TimeSpan(int days, int seconds, int milliseconds, int microseconds=0) noexcept
期間として日数,秒,ミリ秒,マイクロ秒を指定して初期化します。
TimeValue & operator-=(const TimeValue &rhs) noexcept
減算します。
TimeValue & operator+=(const TimeValue &rhs) noexcept
加算します。
TimeValue operator+() const noexcept
単項演算子です。
bool operator>(const DateTime &rhs) const noexcept
rhs より未来の時刻ならtrueを返します。
bool operator!=(const DateTime &rhs) const noexcept
rhs と同一時刻でないならtrueを返します。