diff --git a/src/libs/core/impl/PartialDateTime.cpp b/src/libs/core/impl/PartialDateTime.cpp index 1d88c3f7..24173de9 100644 --- a/src/libs/core/impl/PartialDateTime.cpp +++ b/src/libs/core/impl/PartialDateTime.cpp @@ -73,57 +73,7 @@ namespace lms::core for (const char* format : formats) { - PartialDateTime candidate; - - std::tm tm{}; - tm.tm_year = std::numeric_limits::min(); - tm.tm_mon = std::numeric_limits::min(); - tm.tm_mday = std::numeric_limits::min(); - tm.tm_hour = std::numeric_limits::min(); - tm.tm_min = std::numeric_limits::min(); - tm.tm_sec = std::numeric_limits::min(); - - std::istringstream ss{ dateTimeStr }; - ss >> std::get_time(&tm, format); - if (ss.fail()) - continue; - - if (tm.tm_sec != std::numeric_limits::min()) - { - candidate._sec = tm.tm_sec; - candidate._precision = Precision::Sec; - } - if (tm.tm_min != std::numeric_limits::min()) - { - candidate._min = tm.tm_min; - if (candidate._precision == Precision::Invalid) - candidate._precision = Precision::Min; - } - if (tm.tm_hour != std::numeric_limits::min()) - { - candidate._hour = tm.tm_hour; - if (candidate._precision == Precision::Invalid) - candidate._precision = Precision::Hour; - } - if (tm.tm_mday != std::numeric_limits::min()) - { - candidate._day = tm.tm_mday; - if (candidate._precision == Precision::Invalid) - candidate._precision = Precision::Day; - } - if (tm.tm_mon != std::numeric_limits::min()) - { - candidate._month = tm.tm_mon + 1; // tm.tm_mon is [0, 11] - if (candidate._precision == Precision::Invalid) - candidate._precision = Precision::Month; - } - if (tm.tm_year != std::numeric_limits::min()) - { - candidate._year = tm.tm_year + 1900; // tm.tm_year is years since 1900 - if (candidate._precision == Precision::Invalid) - candidate._precision = Precision::Year; - } - + PartialDateTime candidate{ parseDateTime(format, dateTimeStr) }; if (candidate > res) res = candidate; @@ -155,4 +105,60 @@ namespace lms::core return ss.str(); } + + PartialDateTime PartialDateTime::parseDateTime(const char* format, const std::string& dateTimeStr) + { + PartialDateTime res; + + std::tm tm{}; + tm.tm_year = std::numeric_limits::min(); + tm.tm_mon = std::numeric_limits::min(); + tm.tm_mday = std::numeric_limits::min(); + tm.tm_hour = std::numeric_limits::min(); + tm.tm_min = std::numeric_limits::min(); + tm.tm_sec = std::numeric_limits::min(); + + std::istringstream ss{ dateTimeStr }; + ss >> std::get_time(&tm, format); + if (ss.fail()) + return res; + + if (tm.tm_sec != std::numeric_limits::min()) + { + res._sec = tm.tm_sec; + res._precision = Precision::Sec; + } + if (tm.tm_min != std::numeric_limits::min()) + { + res._min = tm.tm_min; + if (res._precision == Precision::Invalid) + res._precision = Precision::Min; + } + if (tm.tm_hour != std::numeric_limits::min()) + { + res._hour = tm.tm_hour; + if (res._precision == Precision::Invalid) + res._precision = Precision::Hour; + } + if (tm.tm_mday != std::numeric_limits::min()) + { + res._day = tm.tm_mday; + if (res._precision == Precision::Invalid) + res._precision = Precision::Day; + } + if (tm.tm_mon != std::numeric_limits::min()) + { + res._month = tm.tm_mon + 1; // tm.tm_mon is [0, 11] + if (res._precision == Precision::Invalid) + res._precision = Precision::Month; + } + if (tm.tm_year != std::numeric_limits::min()) + { + res._year = tm.tm_year + 1900; // tm.tm_year is years since 1900 + if (res._precision == Precision::Invalid) + res._precision = Precision::Year; + } + + return res; + } } // namespace lms::core diff --git a/src/libs/core/include/core/PartialDateTime.hpp b/src/libs/core/include/core/PartialDateTime.hpp index 87000499..a16a44d8 100644 --- a/src/libs/core/include/core/PartialDateTime.hpp +++ b/src/libs/core/include/core/PartialDateTime.hpp @@ -46,6 +46,8 @@ namespace lms::core constexpr auto operator<=>(const PartialDateTime& other) const = default; private: + static PartialDateTime parseDateTime(const char* format, const std::string& dateTimeStr); + std::int16_t _year{}; std::uint8_t _month{}; // 1 to 12 std::uint8_t _day{}; // 1 to 31