#include "utils/time_utils.hpp" #include "utils/extern/date.h" #include #include #include #include #include #include namespace redfish::time_utils { std::optional 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 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 date.time_since_epoch(); } } return std::nullopt; } } // namespace redfish::time_utils