diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index 0d6be71..533c15e 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -331,7 +331,7 @@
 
 inline void parseDumpEntryFromDbusObject(
     const dbus::utility::ManagedObjectType::value_type& object,
-    std::string& dumpStatus, uint64_t& size, uint64_t& timestamp,
+    std::string& dumpStatus, uint64_t& size, uint64_t& timestampUs,
     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
 {
     for (const auto& interfaceMap : object.second)
@@ -384,7 +384,7 @@
                         messages::internalError(asyncResp->res);
                         break;
                     }
-                    timestamp = (*usecsTimeStamp / 1000 / 1000);
+                    timestampUs = *usecsTimeStamp;
                     break;
                 }
             }
@@ -471,7 +471,7 @@
             {
                 continue;
             }
-            uint64_t timestamp = 0;
+            uint64_t timestampUs = 0;
             uint64_t size = 0;
             std::string dumpStatus;
             nlohmann::json::object_t thisEntry;
@@ -482,7 +482,7 @@
                 continue;
             }
 
-            parseDumpEntryFromDbusObject(object, dumpStatus, size, timestamp,
+            parseDumpEntryFromDbusObject(object, dumpStatus, size, timestampUs,
                                          asyncResp);
 
             if (dumpStatus !=
@@ -497,19 +497,26 @@
             thisEntry["@odata.id"] = entriesPath + entryID;
             thisEntry["Id"] = entryID;
             thisEntry["EntryType"] = "Event";
-            thisEntry["Created"] =
-                redfish::time_utils::getDateTimeUint(timestamp);
             thisEntry["Name"] = dumpType + " Dump Entry";
 
             if (dumpType == "BMC")
             {
+                thisEntry["Created"] = redfish::time_utils::getDateTimeUint(
+                    timestampUs / 1000 / 1000);
                 thisEntry["DiagnosticDataType"] = "Manager";
                 thisEntry["AdditionalDataURI"] =
                     entriesPath + entryID + "/attachment";
                 thisEntry["AdditionalDataSizeBytes"] = size;
             }
+            else if (dumpType == "FaultLog")
+            {
+                thisEntry["Created"] =
+                    redfish::time_utils::getDateTimeUintUs(timestampUs);
+            }
             else if (dumpType == "System")
             {
+                thisEntry["Created"] = redfish::time_utils::getDateTimeUint(
+                    timestampUs / 1000 / 1000);
                 thisEntry["DiagnosticDataType"] = "OEM";
                 thisEntry["OEMDiagnosticDataType"] = "System";
                 thisEntry["AdditionalDataURI"] =
@@ -559,12 +566,12 @@
             }
 
             foundDumpEntry = true;
-            uint64_t timestamp = 0;
+            uint64_t timestampUs = 0;
             uint64_t size = 0;
             std::string dumpStatus;
 
             parseDumpEntryFromDbusObject(objectPath, dumpStatus, size,
-                                         timestamp, asyncResp);
+                                         timestampUs, asyncResp);
 
             if (dumpStatus !=
                     "xyz.openbmc_project.Common.Progress.OperationStatus.Completed" &&
@@ -581,19 +588,28 @@
             asyncResp->res.jsonValue["@odata.id"] = entriesPath + entryID;
             asyncResp->res.jsonValue["Id"] = entryID;
             asyncResp->res.jsonValue["EntryType"] = "Event";
-            asyncResp->res.jsonValue["Created"] =
-                redfish::time_utils::getDateTimeUint(timestamp);
             asyncResp->res.jsonValue["Name"] = dumpType + " Dump Entry";
 
             if (dumpType == "BMC")
             {
+                asyncResp->res.jsonValue["Created"] =
+                    redfish::time_utils::getDateTimeUint(timestampUs / 1000 /
+                                                         1000);
                 asyncResp->res.jsonValue["DiagnosticDataType"] = "Manager";
                 asyncResp->res.jsonValue["AdditionalDataURI"] =
                     entriesPath + entryID + "/attachment";
                 asyncResp->res.jsonValue["AdditionalDataSizeBytes"] = size;
             }
+            else if (dumpType == "FaultLog")
+            {
+                asyncResp->res.jsonValue["Created"] =
+                    redfish::time_utils::getDateTimeUintUs(timestampUs);
+            }
             else if (dumpType == "System")
             {
+                asyncResp->res.jsonValue["Created"] =
+                    redfish::time_utils::getDateTimeUint(timestampUs / 1000 /
+                                                         1000);
                 asyncResp->res.jsonValue["DiagnosticDataType"] = "OEM";
                 asyncResp->res.jsonValue["OEMDiagnosticDataType"] = "System";
                 asyncResp->res.jsonValue["AdditionalDataURI"] =
