9 using namespace std::chrono_literals;
21 template<
typename Rep,
typename Period>
22 constexpr DateTime(
const std::chrono::duration<Rep, Period>& duration) noexcept : _value{std::chrono::duration_cast<std::chrono::microseconds>(duration).count()} {}
30 template<
typename T =
float>
31 constexpr static DateTime Seconds(
const T& seconds)
noexcept {
return {std::chrono::duration<T>(seconds)}; }
39 template<
typename T =
double>
40 constexpr static DateTime Milliseconds(
const T& milliseconds)
noexcept {
return {std::chrono::duration<T, std::micro>(milliseconds)}; }
48 template<
typename T = u
int64_t>
49 constexpr static DateTime Microseconds(
const T& microseconds)
noexcept {
return {std::chrono::duration<T, std::micro>(microseconds)}; }
56 template<
typename T =
float>
57 constexpr auto AsSeconds() const noexcept {
return static_cast<T
>(_value.count()) /
static_cast<T
>(1000000); }
64 template<
typename T =
double>
65 constexpr auto AsMilliseconds() const noexcept {
return static_cast<T
>(_value.count()) /
static_cast<T
>(1000); }
72 template<
typename T = u
int64_t>
73 constexpr auto AsMicroseconds() const noexcept {
return static_cast<T
>(_value.count()); }
80 static const auto localEpoch = std::chrono::high_resolution_clock::now();
81 return std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - localEpoch);
89 static std::string
Get(std::string_view format =
"%Y-%m-%d %H:%M:%S") {
90 auto now = std::chrono::system_clock::now();
91 auto timeT = std::chrono::system_clock::to_time_t(now);
94 localtime_s(&localTime, &timeT);
96 localtime_r(&timeT, &localTime);
99 ss << std::put_time(&localTime, format.data());
109 template<
typename Rep,
typename Period>
110 constexpr explicit operator std::chrono::duration<Rep, Period>() const noexcept {
111 return std::chrono::duration_cast<std::chrono::duration<Rep, Period>>(_value);
219 constexpr friend double operator/(
const DateTime& lhs,
const DateTime& rhs)
noexcept {
return static_cast<double>(lhs._value.count()) /
static_cast<double>(rhs._value.count()); }
228 template<
typename Period = std::ratio<1, 1>>
230 return std::modf(std::chrono::duration_cast<std::chrono::duration<double, Period>>(lhs._value), std::chrono::duration_cast<std::chrono::duration<double, Period>>(rhs._value));
271 std::chrono::microseconds _value{};
constexpr friend DateTime operator*(const DateTime &lhs, int64_t rhs) noexcept
Multiplies a DateTime object by an integer value.
constexpr friend DateTime operator/(const DateTime &lhs, int64_t rhs) noexcept
Divides a DateTime object by an integer value.
constexpr friend DateTime operator/(const DateTime &lhs, float rhs) noexcept
Divides a DateTime object by a floating-point value.
constexpr bool operator>=(const DateTime &rhs) const noexcept
Compares if one DateTime object is greater than or equal to another.
constexpr auto AsMicroseconds() const noexcept
Converts the time duration to microseconds.
static constexpr DateTime Microseconds(const T µseconds) noexcept
Creates a DateTime object representing microseconds.
static constexpr DateTime Milliseconds(const T &milliseconds) noexcept
Creates a DateTime object representing milliseconds.
constexpr bool operator<=(const DateTime &rhs) const noexcept
Compares if one DateTime object is less than or equal to another.
constexpr auto AsSeconds() const noexcept
Converts the time duration to seconds.
constexpr DateTime operator-() const noexcept
Negates the DateTime value.
constexpr DateTime & operator*=(float rhs) noexcept
Multiplies this DateTime object by a floating-point value.
constexpr DateTime(const std::chrono::duration< Rep, Period > &duration) noexcept
Constructs a DateTime object from a duration.
constexpr friend DateTime operator+(const DateTime &lhs, const DateTime &rhs) noexcept
Adds two DateTime objects.
constexpr DateTime & operator+=(const DateTime &rhs) noexcept
Adds another DateTime object to this one.
constexpr friend double operator%(const DateTime &lhs, const DateTime &rhs)
Computes the modulo (remainder) of one DateTime object divided by another.
static std::string Get(std::string_view format="%Y-%m-%d %H:%M:%S")
Gets the current system time formatted as a string.
constexpr DateTime & operator/=(float rhs) noexcept
Divides this DateTime object by a floating-point value.
constexpr bool operator<(const DateTime &rhs) const noexcept
Compares if one DateTime object is less than another.
constexpr DateTime & operator*=(int64_t rhs) noexcept
Multiplies this DateTime object by an integer value.
constexpr DateTime & operator/=(int64_t rhs) noexcept
Divides this DateTime object by an integer value.
static DateTime Now() noexcept
Gets the current time since a local epoch.
static constexpr DateTime Seconds(const T &seconds) noexcept
Creates a DateTime object representing seconds.
constexpr friend DateTime operator*(int64_t lhs, const DateTime &rhs) noexcept
Multiplies an integer value by a DateTime object.
constexpr bool operator!=(const DateTime &rhs) const noexcept
Compares if two DateTime objects are not equal.
constexpr friend double operator/(const DateTime &lhs, const DateTime &rhs) noexcept
Divides one DateTime object by another.
constexpr friend DateTime operator*(const DateTime &lhs, float rhs) noexcept
Multiplies a DateTime object by a floating-point value.
constexpr bool operator==(const DateTime &rhs) const noexcept
Compares if two DateTime objects are equal.
constexpr auto AsMilliseconds() const noexcept
Converts the time duration to milliseconds.
constexpr DateTime & operator-=(const DateTime &rhs) noexcept
Subtracts another DateTime object from this one.
constexpr friend DateTime operator-(const DateTime &lhs, const DateTime &rhs) noexcept
Subtracts one DateTime object from another.
constexpr bool operator>(const DateTime &rhs) const noexcept
Compares if one DateTime object is greater than another.
constexpr friend DateTime operator*(float lhs, const DateTime &rhs) noexcept
Multiplies a floating-point value by a DateTime object.