14#include <cctz/civil_time.h>
15#include <cctz/time_zone.h>
17#include <userver/utils/datetime/wall_coarse_clock.hpp>
19USERVER_NAMESPACE_BEGIN
26inline constexpr std::time_t kStartOfTheEpoch = 0;
34inline const std::string
kIsoFormat =
"%Y-%m-%dT%H:%M:%SZ";
35inline const std::string kFractionFormat =
"%Y-%m-%dT%H:%M:%S.%E*f%z";
37using timepair_t = std::pair<std::uint8_t, std::uint8_t>;
42 DateParseError(
const std::string& timestring);
48 TimezoneLookupError(
const std::string& tzname);
55std::chrono::system_clock::time_point
Now()
noexcept;
59std::chrono::system_clock::time_point
Epoch()
noexcept;
70std::chrono::steady_clock::time_point
SteadyNow()
noexcept;
81 using time_point = std::chrono::steady_clock::time_point;
94 bool include_time_to =
false
100std::chrono::system_clock::time_point
DoGuessStringtime(
const std::string& timestring,
const cctz::time_zone& timezone);
112std::string Timestring(std::chrono::system_clock::time_point tp);
118 std::chrono::system_clock::time_point tp,
126template <
class Duration>
128 std::chrono::time_point<std::chrono::system_clock, Duration> tp,
131 using quotient = std::ratio_divide<
typename Duration::period, std::chrono::hours::period>;
132 if constexpr (quotient::num <= quotient::den) {
133 return cctz::format(format, tp, cctz::utc_time_zone());
136 const auto days = tp.time_since_epoch();
137 if (days > std::chrono::duration_cast<Duration>(std::chrono::hours::max())) {
138 throw std::runtime_error(
"tp does not find std::chrono::hours");
140 const std::chrono::time_point<std::chrono::system_clock, std::chrono::hours>
141 tp_hours(std::chrono::duration_cast<std::chrono::hours>(days));
142 return cctz::format(format, tp_hours, cctz::utc_time_zone());
151 const std::string& timestring,
160 const std::string& timestring,
166std::chrono::system_clock::time_point
Stringtime(
const std::string& timestring);
173 const std::string& timestring,
174 const cctz::time_zone& timezone,
175 const std::string& format
180std::optional<std::chrono::system_clock::time_point>
OptionalStringtime(
const std::string& timestring);
225template <
class Duration,
class Clock>
226double CalcTimeDiff(
const std::chrono::time_point<Clock>& a,
const std::chrono::time_point<Clock>& b) {
227 const auto duration_a = a.time_since_epoch();
228 const auto duration_b = b.time_since_epoch();
229 return std::chrono::duration_cast<Duration>(duration_a - duration_b).count();