25 inline static constexpr uint8_t
minDay = 1;
27 inline static constexpr uint8_t
maxDay = 31;
33 inline static constexpr uint8_t
maxHour = 23;
50 Time(
bool isUTCTime =
true);
55 Time(std::filesystem::file_time_type fileTime);
61#if !defined(WINDOWS) && !defined(__linux__)
66 Time(int64_t seconds) :
Time{static_cast<time_t>(seconds)} {}
72 Time(double seconds) : Time{static_cast<time_t>(seconds)} {
73 m_microsecond =
static_cast<int32_t
>(1e6 * fmod(seconds, 1.0));
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);
94 Time& operator=(
const std::chrono::system_clock::time_point& source);
106 bool operator==(
const Time& ref)
const {
return compare(ref) == std::strong_ordering::equal; }
118 Time& operator+=(int32_t days);
123 operator std::chrono::system_clock::time_point()
const;
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; }
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;
211 Time& setToCurrent(
bool isUTCTime =
true);
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)); }
271 void setSecondsSince1970(
double totalSeconds);
278 std::chrono::system_clock::time_point makeTimePoint(std::optional<double> prec = std::nullopt)
const;
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;
291 uint8_t m_minute = 0;
292 uint32_t m_second : 8 = 0;
293 uint32_t m_microsecond : 24 = 0;