summaryrefslogtreecommitdiff
path: root/redfish-core/src/utils
diff options
context:
space:
mode:
Diffstat (limited to 'redfish-core/src/utils')
-rw-r--r--redfish-core/src/utils/time_utils.cpp44
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