From dc6dd682ff95318a1f54d734c5f5237262589d34 Mon Sep 17 00:00:00 2001 From: Nomango Date: Sun, 24 May 2020 12:00:47 +0800 Subject: [PATCH] add ClockTime --- src/kiwano/core/Time.cpp | 82 ++++++++++++++++++++++++++++++++++++++++ src/kiwano/core/Time.h | 45 ++++++++++++++++++++++ 2 files changed, 127 insertions(+) diff --git a/src/kiwano/core/Time.cpp b/src/kiwano/core/Time.cpp index e08fba77..969c4bee 100644 --- a/src/kiwano/core/Time.cpp +++ b/src/kiwano/core/Time.cpp @@ -98,6 +98,88 @@ Time Time::Now() noexcept #endif } +//------------------------------------------------------- +// ClockTime +//------------------------------------------------------- + +ClockTime::ClockTime() + : ms_since_epoch_(0) +{ +} + +long ClockTime::GetTimeStamp() const +{ + using std::chrono::duration_cast; + using std::chrono::milliseconds; + using std::chrono::seconds; + + const auto timestamp = duration_cast(milliseconds(ms_since_epoch_)).count(); + return static_cast(timestamp); +} + +long ClockTime::GetMillisecondsSinceEpoch() const +{ + return ms_since_epoch_; +} + +std::time_t ClockTime::GetCTime() const +{ + return static_cast(GetTimeStamp()); +} + +ClockTime::ClockTime(long ms_since_epoch) + : ms_since_epoch_(ms_since_epoch) +{ +} + +ClockTime ClockTime::FromTimeStamp(long timestamp) noexcept +{ + using std::chrono::duration_cast; + using std::chrono::milliseconds; + using std::chrono::seconds; + + const auto ms = duration_cast(seconds(timestamp)).count(); + return ClockTime(static_cast(ms)); +} + +ClockTime ClockTime::Now() noexcept +{ + using std::chrono::duration_cast; + using std::chrono::milliseconds; + using std::chrono::system_clock; + + const auto now = system_clock::now(); + const long long count = duration_cast(now.time_since_epoch()).count(); + return ClockTime{ static_cast(count) }; +} + +const Duration ClockTime::operator-(const ClockTime& other) const +{ + return Duration(ms_since_epoch_ - other.ms_since_epoch_); +} + +const ClockTime ClockTime::operator+(const Duration& dur) const +{ + return ClockTime{ ms_since_epoch_ + dur.Milliseconds() }; +} + +const ClockTime ClockTime::operator-(const Duration& dur) const +{ + return ClockTime{ ms_since_epoch_ - dur.Milliseconds() }; +} + +ClockTime& ClockTime::operator+=(const Duration& other) +{ + ms_since_epoch_ += other.Milliseconds(); + return (*this); +} + +ClockTime& ClockTime::operator-=(const Duration& other) +{ + ms_since_epoch_ -= other.Milliseconds(); + return (*this); +} + //------------------------------------------------------- // Duration //------------------------------------------------------- diff --git a/src/kiwano/core/Time.h b/src/kiwano/core/Time.h index e563c440..5f86341e 100644 --- a/src/kiwano/core/Time.h +++ b/src/kiwano/core/Time.h @@ -20,6 +20,7 @@ #pragma once #include +#include namespace kiwano { @@ -198,6 +199,49 @@ private: long dur_; }; +/** + * \~chinese + * @brief 时钟时间 + */ +struct KGE_API ClockTime +{ + ClockTime(); + + /// \~chinese + /// @brief 获取当前时间戳 + long GetTimeStamp() const; + + /// \~chinese + /// @brief 获取自纪元以来的毫秒数 + long GetMillisecondsSinceEpoch() const; + + /// \~chinese + /// @brief 获取 C 风格的时间 + std::time_t GetCTime() const; + + /// \~chinese + /// @brief 获取当前时间 + static ClockTime Now() noexcept; + + /// \~chinese + /// @brief 时间戳转化为时间 + static ClockTime FromTimeStamp(long timestamp) noexcept; + + const Duration operator-(const ClockTime&) const; + + const ClockTime operator+(const Duration&) const; + const ClockTime operator-(const Duration&) const; + + ClockTime& operator+=(const Duration&); + ClockTime& operator-=(const Duration&); + +private: + ClockTime(long ms_since_epoch); + +private: + long ms_since_epoch_; +}; + inline long Duration::Milliseconds() const { return milliseconds_; @@ -232,6 +276,7 @@ inline bool Time::IsZero() const { return dur_ == 0; } + } // namespace kiwano #if defined(KGE_HAS_LITERALS)