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);
124template <
class Duration>
126 std::chrono::time_point<std::chrono::system_clock, Duration> tp,
129 using quotient = std::ratio_divide<
typename Duration::period, std::chrono::hours::period>;
130 if constexpr (quotient::num <= quotient::den) {
131 return cctz::format(format, tp, cctz::utc_time_zone());
134 const auto days = tp.time_since_epoch();
135 if (days > std::chrono::duration_cast<Duration>(std::chrono::hours::max())) {
136 throw std::runtime_error(
"tp does not find std::chrono::hours");
138 const std::chrono::time_point<std::chrono::system_clock, std::chrono::hours> tp_hours(
139 std::chrono::duration_cast<std::chrono::hours>(days)
141 return cctz::format(format, tp_hours, cctz::utc_time_zone());
149std::chrono::system_clock::time_point
156std::chrono::system_clock::time_point
161std::chrono::system_clock::time_point
Stringtime(
const std::string& timestring);
167std::optional<std::chrono::system_clock::time_point>
168OptionalStringtime(
const std::string& timestring,
const cctz::time_zone& timezone,
const std::string& format);
172std::optional<std::chrono::system_clock::time_point>
OptionalStringtime(
const std::string& timestring);
217template <
class Duration,
class Clock>
218double CalcTimeDiff(
const std::chrono::time_point<Clock>& a,
const std::chrono::time_point<Clock>& b) {
219 const auto duration_a = a.time_since_epoch();
220 const auto duration_b = b.time_since_epoch();
221 return std::chrono::duration_cast<Duration>(duration_a - duration_b).count();