diff --git a/wxdata/include/scwx/util/strings.hpp b/wxdata/include/scwx/util/strings.hpp index f3088c9d..8aa6014d 100644 --- a/wxdata/include/scwx/util/strings.hpp +++ b/wxdata/include/scwx/util/strings.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -29,5 +30,8 @@ std::vector ParseTokens(const std::string& s, std::string ToString(const std::vector& v); +template +std::optional TryParseUnsignedLong(const std::string& str); + } // namespace util } // namespace scwx diff --git a/wxdata/include/scwx/util/time.hpp b/wxdata/include/scwx/util/time.hpp index dc58aa14..04cc1d39 100644 --- a/wxdata/include/scwx/util/time.hpp +++ b/wxdata/include/scwx/util/time.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #if !defined(_MSC_VER) # include @@ -24,5 +25,9 @@ std::string TimeString(std::chrono::system_clock::time_point time, const time_zone* timeZone = nullptr, bool epochValid = true); +template +std::optional> +TryParseDateTime(const std::string& dateTimeFormat, const std::string& str); + } // namespace util } // namespace scwx diff --git a/wxdata/source/scwx/util/strings.cpp b/wxdata/source/scwx/util/strings.cpp index e6b46a48..c17489da 100644 --- a/wxdata/source/scwx/util/strings.cpp +++ b/wxdata/source/scwx/util/strings.cpp @@ -88,5 +88,24 @@ std::string ToString(const std::vector& v) return value; } +template +std::optional TryParseUnsignedLong(const std::string& str) +{ + std::optional value = std::nullopt; + + try + { + value = static_cast(std::stoul(str)); + } + catch (const std::exception&) + { + } + + return value; +} + +template std::optional +TryParseUnsignedLong(const std::string& str); + } // namespace util } // namespace scwx diff --git a/wxdata/source/scwx/util/time.cpp b/wxdata/source/scwx/util/time.cpp index 7ab46c48..9fdd9a3e 100644 --- a/wxdata/source/scwx/util/time.cpp +++ b/wxdata/source/scwx/util/time.cpp @@ -10,6 +10,12 @@ #include +#include + +#if !defined(_MSC_VER) +# include +#endif + namespace scwx { namespace util @@ -55,5 +61,33 @@ std::string TimeString(std::chrono::system_clock::time_point time, return os.str(); } +template +std::optional> +TryParseDateTime(const std::string& dateTimeFormat, const std::string& str) +{ + using namespace std::chrono; + +#if !defined(_MSC_VER) + using namespace date; +#endif + + std::optional> value = std::nullopt; + std::chrono::sys_time dateTime; + std::istringstream ssDateTime {str}; + + ssDateTime >> parse(dateTimeFormat, dateTime); + + if (!ssDateTime.fail()) + { + value = dateTime; + } + + return value; +} + +template std::optional> +TryParseDateTime(const std::string& dateTimeFormat, + const std::string& str); + } // namespace util } // namespace scwx