ActiveLib
Loading...
Searching...
No Matches
Time.h
1
6#ifndef ACTIVE_UTILITY_TIME
7#define ACTIVE_UTILITY_TIME
8
9#include "Active/Utility/MathFunctions.h"
10
11#include <chrono>
12#include <compare>
13#include <filesystem>
14#include <optional>
15
16namespace active::utility {
17
19 class Time {
20 public:
21
22 // MARK: Constants
23
25 inline static constexpr uint8_t minDay = 1;
27 inline static constexpr uint8_t maxDay = 31;
29 inline static constexpr uint8_t minMonth = 1;
31 inline static constexpr uint8_t maxMonth = 12;
33 inline static constexpr uint8_t maxHour = 23;
35 inline static constexpr uint8_t maxMinute = 59;
37 inline static constexpr uint8_t maxSecond = 59;
38
39 // MARK: - Types
40
42 using Option = std::optional<Time>;
43
44 // MARK: - Constructors
45
50 Time(bool isUTCTime = true);
55 Time(std::filesystem::file_time_type fileTime);
60 Time(time_t time);
61#if !defined(WINDOWS) && !defined(__linux__)
66 Time(int64_t seconds) : Time{static_cast<time_t>(seconds)} {}
67#endif //WINDOWS
72 Time(double seconds) : Time{static_cast<time_t>(seconds)} {
73 m_microsecond = static_cast<int32_t>(1e6 * fmod(seconds, 1.0));
74 }
85 Time(int32_t year, std::chrono::month month, uint8_t day, uint8_t hour = 0, uint8_t minute = 0, double second = 0, int16_t utcOffset = 0);
86
87 // MARK: - Operators
88
94 Time& operator=(const std::chrono::system_clock::time_point& source);
100 std::strong_ordering operator<=>(const Time& ref) const { return compare(ref); }
106 bool operator==(const Time& ref) const { return compare(ref) == std::strong_ordering::equal; }
112 bool operator!=(const Time& ref) const { return !(*this == ref); }
118 Time& operator+=(int32_t days);
123 operator std::chrono::system_clock::time_point() const;
124
125 // MARK: - Functions (const)
126
133 std::strong_ordering compare(const Time& ref, std::optional<double> epsMicrosec = std::nullopt) const;
138 int64_t year() const { return m_year; }
143 std::chrono::month month() const { return std::chrono::month{m_month}; }
148 uint8_t day() const { return m_day; }
153 uint8_t hour() const { return m_hour; }
158 uint8_t minute() const { return m_minute; }
163 uint8_t second() const { return m_second; }
168 uint32_t microsecond() const { return m_microsecond; }
173 std::pair<int16_t, int16_t> getUTCOffset() const;
178 double secondsSince1970() const;
184 double differenceInSeconds(const Time& other) const;
190 int64_t differenceInMinutes(const Time& other) const;
196 int64_t differenceInHours(const Time& other) const;
202 int64_t differenceInDays(const Time& other) const;
203
204 // MARK: - Functions (mutating)
205
211 Time& setToCurrent(bool isUTCTime = true);
216 Time& resetTime();
221 Time& resetDate();
227 Time& addDays(int16_t daystoAdd);
233 Time& addHours(int16_t hourstoAdd);
239 Time& addMinutes(int16_t minstoAdd);
245 Time& addSeconds(double secsToAdd);
249 void setHour(uint8_t val) { m_hour = static_cast<uint8_t>(std::min(val, maxHour)); }
253 void setMinute(uint8_t val) { m_minute = static_cast<uint8_t>(std::min(val, maxMinute));}
257 void setSecond(uint8_t val) { m_second = static_cast<uint8_t>(std::min(val, maxSecond)); }
261 void setMicrosecond(uint32_t val) { m_microsecond = val; }
266 void setUTCOffset(int16_t offset) { m_utcOffset = offset; }
271 void setSecondsSince1970(double totalSeconds);
272
273 private:
278 std::chrono::system_clock::time_point makeTimePoint(std::optional<double> prec = std::nullopt) const;
282 void testValidity();
283
284 // MARK: - Variables
285
286 int64_t m_utcOffset : 12 = 0;
287 int64_t m_year : 52 = 0;
288 uint8_t m_month = minMonth;
289 uint8_t m_day = minDay;
290 uint8_t m_hour = 0;
291 uint8_t m_minute = 0;
292 uint32_t m_second : 8 = 0;
293 uint32_t m_microsecond : 24 = 0;
294 };
295
296}
297
298#endif //ACTIVE_UTILITY_TIME
299
A class to represent a date/time.
Definition Time.h:19
static constexpr uint8_t maxSecond
Maximum acceptable second value.
Definition Time.h:37
Time(bool isUTCTime=true)
Definition Time.cpp:63
bool operator==(const Time &ref) const
Definition Time.h:106
void setHour(uint8_t val)
Definition Time.h:249
static constexpr uint8_t maxMonth
Maximum acceptable month value.
Definition Time.h:31
static constexpr uint8_t maxDay
Maximum acceptable day value.
Definition Time.h:27
static constexpr uint8_t minMonth
Minimum acceptable month value.
Definition Time.h:29
uint8_t hour() const
Definition Time.h:153
std::strong_ordering operator<=>(const Time &ref) const
Definition Time.h:100
void setSecond(uint8_t val)
Definition Time.h:257
int64_t year() const
Definition Time.h:138
uint8_t minute() const
Definition Time.h:158
uint8_t second() const
Definition Time.h:163
std::optional< Time > Option
Optional.
Definition Time.h:42
static constexpr uint8_t minDay
Minimum acceptable day value.
Definition Time.h:25
void setUTCOffset(int16_t offset)
Definition Time.h:266
uint32_t microsecond() const
Definition Time.h:168
static constexpr uint8_t maxHour
Maximum acceptable hour value.
Definition Time.h:33
std::chrono::month month() const
Definition Time.h:143
bool operator!=(const Time &ref) const
Definition Time.h:112
void setMicrosecond(uint32_t val)
Definition Time.h:261
Time(int64_t seconds)
Definition Time.h:66
void setMinute(uint8_t val)
Definition Time.h:253
uint8_t day() const
Definition Time.h:148
static constexpr uint8_t maxMinute
Maximum acceptable minute value.
Definition Time.h:35
Definition Base64Transport.h:11