# From: Myself and (mostly) WerWolv <hey@werwolv.net>
# Fixes https://github.com/WerWolv/ImHex/issues/2225
--- a/lib/external/pattern_language/lib/source/pl/lib/std/time.cpp
+++ b/lib/external/pattern_language/lib/source/pl/lib/std/time.cpp
@@ -11,7 +11,7 @@
 
 namespace pl::lib::libstd::time {
 
-    static u128 packTMValue(std::tm tm) {
+    static u128 packTMValue(const std::tm &tm) {
         return
             (u128(tm.tm_sec)   << 0)  |
             (u128(tm.tm_min)   << 8)  |
@@ -57,9 +57,10 @@ namespace pl::lib::libstd::time {
                 auto time = time_t(params[0].toUnsigned());
 
                 try {
-                    auto localTime = fmt::localtime(time);
+                    auto localTime = std::localtime(&time);
+                    if (localTime == nullptr) return u128(0);
 
-                    return { packTMValue(localTime) };
+                    return { packTMValue(*localTime) };
                 } catch (const fmt::format_error&) {
                     return u128(0);
                 }
@@ -70,9 +71,10 @@ namespace pl::lib::libstd::time {
                 auto time = time_t(params[0].toUnsigned());
 
                 try {
-                    auto gmTime = fmt::gmtime(time);
+                    auto gmTime = std::gmtime(&time);
+                    if (gmTime == nullptr) return u128(0);
 
-                    return { packTMValue(gmTime) };
+                    return { packTMValue(*gmTime) };
                 } catch (const fmt::format_error&) {
                     return u128(0);
                 }
--- a/lib/libimhex/source/helpers/logger.cpp
+++ b/lib/libimhex/source/helpers/logger.cpp
@@ -83,7 +83,8 @@ namespace hex::log {
 
             for (const auto &path : paths::Logs.all()) {
                 wolv::io::fs::createDirectories(path);
-                s_loggerFile = wolv::io::File(path / hex::format("{0:%Y%m%d_%H%M%S}.log", fmt::localtime(std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()))), wolv::io::File::Mode::Create);
+                time_t time = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
+                s_loggerFile = wolv::io::File(path / hex::format("{0:%Y%m%d_%H%M%S}.log", *std::localtime(&time)), wolv::io::File::Mode::Create);
                 s_loggerFile.disableBuffering();
 
                 if (s_loggerFile.isValid()) {
@@ -120,7 +121,8 @@ namespace hex::log {
 
 
         void printPrefix(FILE *dest, const fmt::text_style &ts, const std::string &level, const char *projectName) {
-            const auto now = fmt::localtime(std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()));
+            const auto time = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
+            const auto now = *std::localtime(&time);
 
             fmt::print(dest, "[{0:%H:%M:%S}] ", now);
 
--- a/main/gui/source/init/splash_window.cpp
+++ b/main/gui/source/init/splash_window.cpp
@@ -111,7 +111,7 @@ namespace hex::init {
                 const auto now = std::chrono::system_clock::now();
                 const auto time = std::chrono::system_clock::to_time_t(now);
 
-                return fmt::localtime(time);
+                return *std::localtime(&time);
             }();
 
             for (const auto &colorConfig : highlightConfig) {
--- a/plugins/builtin/source/content/data_inspector.cpp
+++ b/plugins/builtin/source/content/data_inspector.cpp
@@ -621,11 +621,16 @@ namespace hex::plugin::builtin {
         ContentRegistry::DataInspector::add("hex.builtin.inspector.time32", sizeof(u32), [](auto buffer, auto endian, auto style) {
             std::ignore = style;
 
-            auto endianAdjustedTime = hex::changeEndianness(*reinterpret_cast<u32 *>(buffer.data()), endian);
+            time_t endianAdjustedTime = hex::changeEndianness(*reinterpret_cast<u32 *>(buffer.data()), endian);
 
             std::string value;
             try {
-                value = hex::format("{0:%a, %d.%m.%Y %H:%M:%S}", fmt::localtime(endianAdjustedTime));
+                auto time = std::localtime(&endianAdjustedTime);
+                if (time == nullptr) {
+                    value = "Invalid";
+                } else {
+                    value = hex::format("{0:%a, %d.%m.%Y %H:%M:%S}", *time);
+                }
             } catch (fmt::format_error &) {
                 value = "Invalid";
             }
@@ -636,11 +641,16 @@ namespace hex::plugin::builtin {
         ContentRegistry::DataInspector::add("hex.builtin.inspector.time64", sizeof(u64), [](auto buffer, auto endian, auto style) {
             std::ignore = style;
 
-            auto endianAdjustedTime = hex::changeEndianness(*reinterpret_cast<u64 *>(buffer.data()), endian);
+            time_t endianAdjustedTime = hex::changeEndianness(*reinterpret_cast<u64 *>(buffer.data()), endian);
 
             std::string value;
             try {
-                value = hex::format("{0:%a, %d.%m.%Y %H:%M:%S}", fmt::localtime(endianAdjustedTime));
+                auto time = std::localtime(&endianAdjustedTime);
+                if (time == nullptr) {
+                    value = "Invalid";
+                } else {
+                    value = hex::format("{0:%a, %d.%m.%Y %H:%M:%S}", *time);
+                }
             } catch (fmt::format_error &) {
                 value = "Invalid";
             }
@@ -653,11 +663,16 @@ namespace hex::plugin::builtin {
         ContentRegistry::DataInspector::add("hex.builtin.inspector.time", sizeof(time_t), [](auto buffer, auto endian, auto style) {
             std::ignore = style;
 
-            auto endianAdjustedTime = hex::changeEndianness(*reinterpret_cast<time_t *>(buffer.data()), endian);
+            time_t endianAdjustedTime = hex::changeEndianness(*reinterpret_cast<time_t *>(buffer.data()), endian);
 
             std::string value;
             try {
-                value = hex::format("{0:%a, %d.%m.%Y %H:%M:%S}", fmt::localtime(endianAdjustedTime));
+                auto time = std::localtime(&endianAdjustedTime);
+                if (time == nullptr) {
+                    value = "Invalid";
+                } else {
+                    value = hex::format("{0:%a, %d.%m.%Y %H:%M:%S}", *time);
+                }
             } catch (fmt::format_error &e) {
                 value = "Invalid";
             }
--- a/plugins/builtin/source/content/providers/file_provider.cpp
+++ b/plugins/builtin/source/content/providers/file_provider.cpp
@@ -135,14 +135,14 @@ namespace hex::plugin::builtin {
         if (m_fileStats.has_value()) {
             std::string creationTime, accessTime, modificationTime;
 
-            try { creationTime = hex::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(m_fileStats->st_ctime)); }
-            catch (const std::exception&) { creationTime = "???"; }
+            try { creationTime = hex::format("{:%Y-%m-%d %H:%M:%S}", *std::localtime(&m_fileStats->st_ctime)); }
+            catch (const fmt::format_error&) { creationTime = "???"; }
 
-            try { accessTime = hex::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(m_fileStats->st_atime)); }
-            catch (const std::exception&) { accessTime = "???"; }
+            try { accessTime = hex::format("{:%Y-%m-%d %H:%M:%S}", *std::localtime(&m_fileStats->st_atime)); }
+            catch (const fmt::format_error&) { accessTime = "???"; }
 
-            try { modificationTime = hex::format("{:%Y-%m-%d %H:%M:%S}", fmt::localtime(m_fileStats->st_mtime)); }
-            catch (const std::exception&) { modificationTime = "???"; }
+            try { modificationTime = hex::format("{:%Y-%m-%d %H:%M:%S}", *std::localtime(&m_fileStats->st_mtime)); }
+            catch (const fmt::format_error&) { modificationTime = "???"; }
 
             result.emplace_back("hex.builtin.provider.file.creation"_lang,      creationTime);
             result.emplace_back("hex.builtin.provider.file.access"_lang,        accessTime);
