From 004ad6ef19082b71ab3bf9fb03575b92266f4dd4 Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Wed, 20 Nov 2024 02:25:59 -0800 Subject: [PATCH] savedatadialog_ui: macOS zoned_time formatting Signed-off-by: Vinicius Rangel --- .../save_data/dialog/savedatadialog_ui.cpp | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/core/libraries/save_data/dialog/savedatadialog_ui.cpp b/src/core/libraries/save_data/dialog/savedatadialog_ui.cpp index f7b72dafa..52abe9101 100644 --- a/src/core/libraries/save_data/dialog/savedatadialog_ui.cpp +++ b/src/core/libraries/save_data/dialog/savedatadialog_ui.cpp @@ -13,6 +13,33 @@ #include "imgui/imgui_std.h" #include "savedatadialog_ui.h" +#ifdef __APPLE__ +#include + +// Need to make a copy of the formatter for std::chrono::local_time for use with date::local_time +template +struct fmt::formatter, Char> : formatter { + FMT_CONSTEXPR formatter() { + this->format_str_ = fmt::detail::string_literal(); + } + + template + auto format(date::local_time val, FormatContext& ctx) const -> decltype(ctx.out()) { + using period = typename Duration::period; + if (period::num == 1 && period::den == 1 && + !std::is_floating_point::value) { + return formatter::format( + localtime(fmt::detail::to_time_t(date::current_zone()->to_sys(val))), ctx); + } + auto epoch = val.time_since_epoch(); + auto subsecs = fmt::detail::duration_cast( + epoch - fmt::detail::duration_cast(epoch)); + return formatter::do_format( + localtime(fmt::detail::to_time_t(date::current_zone()->to_sys(val))), ctx, &subsecs); + } +}; +#endif + using namespace ImGui; using namespace Libraries::CommonDialog; using Common::ElfInfo; @@ -99,13 +126,11 @@ SaveDialogState::SaveDialogState(const OrbisSaveDataDialogParam& param) { auto last_write = param_sfo.GetLastWrite(); #ifdef __APPLE__ - // FIXME: Correct time zone - // zoned_time not available on macOS and date/tz.h requires having tzdb downloaded - std::string date_str = fmt::format("{:%d %b, %Y %R}", last_write); + auto t = date::zoned_time{date::current_zone(), last_write}; #else auto t = std::chrono::zoned_time{std::chrono::current_zone(), last_write}; - std::string date_str = fmt::format("{:%d %b, %Y %R}", t.get_local_time()); #endif + std::string date_str = fmt::format("{:%d %b, %Y %R}", t.get_local_time()); size_t size = Common::FS::GetDirectorySize(dir_path); std::string size_str = SpaceSizeToString(size);