58 if (time.find(
'T') != std::string::npos) {
59 for (
const auto& format : TIMEPOINT_FORMATS) {
60 std::ispanstream time_spanstream(time);
61 time_spanstream >> std::chrono::parse(format, timepoint);
62 if (time_spanstream) {
68 else if (time.find(
':') != std::string::npos) {
69 auto time_prefixed = std::format(
"{:%Y-%m-%d}T{}", Tp::clock::now(), time);
70 for (
const auto& format : TIMEPOINT_FORMATS) {
71 std::ispanstream time_spanstream(time_prefixed);
72 time_spanstream >> std::chrono::parse(format, timepoint);
73 if (time_spanstream) {
80 std::ispanstream time_spanstream(time);
81 time_spanstream >> std::chrono::parse(
"%F", timepoint);
82 return static_cast<bool>(time_spanstream);
99std::optional<std::chrono::nanoseconds>
ParseDuration(
const std::string_view duration) {
100 static constexpr std::array<std::pair<std::string_view, std::chrono::nanoseconds>, 39>
102 {
"h", std::chrono::hours{1}},
103 {
"hr", std::chrono::hours{1}},
104 {
"hour", std::chrono::hours{1}},
105 {
"hours", std::chrono::hours{1}},
106 {
"d", std::chrono::days{1}},
107 {
"day", std::chrono::days{1}},
108 {
"days", std::chrono::days{1}},
109 {
"w", std::chrono::weeks{1}},
110 {
"wk", std::chrono::weeks{1}},
111 {
"week", std::chrono::weeks{1}},
112 {
"weeks", std::chrono::weeks{1}},
113 {
"y", std::chrono::years{1}},
114 {
"yr", std::chrono::years{1}},
115 {
"year", std::chrono::years{1}},
116 {
"years", std::chrono::years{1}},
117 {
"ms", std::chrono::milliseconds{1}},
118 {
"milli", std::chrono::milliseconds{1}},
119 {
"millis", std::chrono::milliseconds{1}},
120 {
"millisecond", std::chrono::milliseconds{1}},
121 {
"milliseconds", std::chrono::milliseconds{1}},
122 {
"us", std::chrono::microseconds{1}},
123 {
"micro", std::chrono::microseconds{1}},
124 {
"micros", std::chrono::microseconds{1}},
125 {
"microsecond", std::chrono::microseconds{1}},
126 {
"microseconds", std::chrono::microseconds{1}},
127 {
"µs", std::chrono::microseconds{1}},
128 {
"ns", std::chrono::nanoseconds{1}},
129 {
"nano", std::chrono::nanoseconds{1}},
130 {
"nanos", std::chrono::nanoseconds{1}},
131 {
"nanosecond", std::chrono::nanoseconds{1}},
132 {
"nanoseconds", std::chrono::nanoseconds{1}},
133 {
"s", std::chrono::seconds{1}},
134 {
"sec", std::chrono::seconds{1}},
135 {
"second", std::chrono::seconds{1}},
136 {
"seconds", std::chrono::seconds{1}},
137 {
"m", std::chrono::minutes{1}},
138 {
"min", std::chrono::minutes{1}},
139 {
"minute", std::chrono::minutes{1}},
140 {
"minutes", std::chrono::minutes{1}}}};
143 while (num_end < duration.size() && std::isdigit(duration[num_end])) {
147 if (num_end == 0 or num_end == duration.size()) {
151 std::string_view num_str = duration.substr(0, num_end);
152 std::string_view unit_str = duration.substr(num_end);
154 while (std::iswspace(unit_str[0])) {
155 unit_str = unit_str.substr(1);
156 if (unit_str.size() == 0) {
162 uint64_t value = std::stoul(std::string(num_str));
163 for (
const auto& [unit, duration_unit] : unit_map) {
164 if (unit_str.starts_with(unit)) {
165 return std::chrono::nanoseconds(value * duration_unit.count());