diff options
Diffstat (limited to 'redfish-core/src/utils')
-rw-r--r-- | redfish-core/src/utils/time_utils.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/redfish-core/src/utils/time_utils.cpp b/redfish-core/src/utils/time_utils.cpp new file mode 100644 index 0000000000..f427ba64c4 --- /dev/null +++ b/redfish-core/src/utils/time_utils.cpp @@ -0,0 +1,44 @@ +#include "utils/time_utils.hpp" + +#include "utils/extern/date.h" + +#include <array> +#include <chrono> +#include <optional> +#include <sstream> +#include <string> +#include <string_view> +#include <version> + +namespace redfish::time_utils +{ +using usSinceEpoch = std::chrono::duration<uint64_t, std::micro>; +std::optional<usSinceEpoch> dateStringToEpoch(std::string_view datetime) +{ + for (const char* format : std::to_array({"%FT%T%Ez", "%FT%TZ", "%FT%T"})) + { + // Parse using signed so we can detect negative dates + std::chrono::sys_time<std::chrono::duration<int64_t, std::micro>> date; + std::istringstream iss(std::string{datetime}); +#if __cpp_lib_chrono >= 201907L + namespace chrono_from_stream = std::chrono; +#else + namespace chrono_from_stream = date; +#endif + if (chrono_from_stream::from_stream(iss, format, date)) + { + if (date.time_since_epoch().count() < 0) + { + return std::nullopt; + } + if (iss.rdbuf()->in_avail() != 0) + { + // More information left at end of string. + continue; + } + return usSinceEpoch{date.time_since_epoch().count()}; + } + } + return std::nullopt; +} +} // namespace redfish::time_utils |