14#include <cctz/civil_time.h>
15#include <cctz/time_zone.h>
17#include <userver/utils/datetime/wall_coarse_clock.hpp>
19USERVER_NAMESPACE_BEGIN
28inline constexpr std::time_t kStartOfTheEpoch = 0;
36inline const std::string
kIsoFormat =
"%Y-%m-%dT%H:%M:%SZ";
37inline const std::string kFractionFormat =
"%Y-%m-%dT%H:%M:%S.%E*f%z";
39using timepair_t = std::pair<std::uint8_t, std::uint8_t>;
44 DateParseError(
const std::string& timestring);
50 TimezoneLookupError(
const std::string& tzname);
57std::chrono::system_clock::time_point
Now()
noexcept;
61std::chrono::system_clock::time_point
Epoch()
noexcept;
72std::chrono::steady_clock::time_point
SteadyNow()
noexcept;
83 using time_point = std::chrono::steady_clock::time_point;
96 bool include_time_to =
false
102std::chrono::system_clock::time_point
DoGuessStringtime(
const std::string& timestring,
const cctz::time_zone& timezone);
114std::string Timestring(std::chrono::system_clock::time_point tp);
120 std::chrono::system_clock::time_point tp,
128template <
class Duration>
130 std::chrono::time_point<std::chrono::system_clock, Duration> tp,
133 using quotient = std::ratio_divide<
typename Duration::period, std::chrono::hours::period>;
134 if constexpr (quotient::num <= quotient::den) {
135 return cctz::format(format, tp, cctz::utc_time_zone());
138 const auto days = tp.time_since_epoch();
139 if (days > std::chrono::duration_cast<Duration>(std::chrono::hours::max())) {
140 throw std::runtime_error(
"tp does not find std::chrono::hours");
142 const std::chrono::time_point<std::chrono::system_clock, std::chrono::hours>
143 tp_hours(std::chrono::duration_cast<std::chrono::hours>(days));
144 return cctz::format(format, tp_hours, cctz::utc_time_zone());
153 const std::string& timestring,
162 const std::string& timestring,
168std::chrono::system_clock::time_point
Stringtime(
const std::string& timestring);
175 const std::string& timestring,
176 const cctz::time_zone& timezone,
177 const std::string& format
182std::optional<std::chrono::system_clock::time_point>
OptionalStringtime(
const std::string& timestring);
227template <
class Duration,
class Clock>
228double CalcTimeDiff(
const std::chrono::time_point<Clock>& a,
const std::chrono::time_point<Clock>& b) {
229 const auto duration_a = a.time_since_epoch();
230 const auto duration_b = b.time_since_epoch();
231 return std::chrono::duration_cast<Duration>(duration_a - duration_b).count();