Skip to content

Commit

Permalink
Support formatting of std time_point with utc_clock (#3110)
Browse files Browse the repository at this point in the history
  • Loading branch information
patrickroocks authored Sep 28, 2022
1 parent 6e0a5f7 commit ad71961
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 0 deletions.
28 changes: 28 additions & 0 deletions include/fmt/chrono.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,15 @@

FMT_BEGIN_NAMESPACE

// Check if std::chrono::utc_timestamp is available.
#ifndef FMT_USE_UTC_TIME
# ifdef __cpp_lib_chrono
# define FMT_USE_UTC_TIME (__cpp_lib_chrono >= 201907L)
# else
# define FMT_USE_UTC_TIME 0
# endif
#endif

// Enable tzset.
#ifndef FMT_USE_TZSET
// UWP doesn't provide _tzset.
Expand Down Expand Up @@ -2014,6 +2023,25 @@ struct formatter<std::chrono::time_point<std::chrono::system_clock, Duration>,
}
};

#if FMT_USE_UTC_TIME
template <typename Char, typename Duration>
struct formatter<std::chrono::time_point<std::chrono::utc_clock, Duration>,
Char> : formatter<std::tm, Char> {
FMT_CONSTEXPR formatter() {
basic_string_view<Char> default_specs =
detail::string_literal<Char, '%', 'F', ' ', '%', 'T'>{};
this->do_parse(default_specs.begin(), default_specs.end());
}

template <typename FormatContext>
auto format(std::chrono::time_point<std::chrono::utc_clock> val,
FormatContext& ctx) const -> decltype(ctx.out()) {
return formatter<std::tm, Char>::format(
localtime(std::chrono::utc_clock::to_sys(val)), ctx);
}
};
#endif

template <typename Char> struct formatter<std::tm, Char> {
private:
enum class spec {
Expand Down
11 changes: 11 additions & 0 deletions test/chrono-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -641,3 +641,14 @@ TEST(chrono_test, cpp20_duration_subsecond_support) {
}

#endif // FMT_STATIC_THOUSANDS_SEPARATOR

// Disable the utc_clock test for windows, as the icu.dll used for tzdb
// (time zone database) is not shipped with many windows versions.
#if FMT_USE_UTC_TIME && !defined(_WIN32)
TEST(chrono_test, utc_clock) {
auto t1 = std::chrono::system_clock::now();
auto t1_utc = std::chrono::utc_clock::from_sys(t1);
EXPECT_EQ(fmt::format("{:%Y-%m-%d %H:%M:%S}", t1),
fmt::format("{:%Y-%m-%d %H:%M:%S}", t1_utc));
}
#endif

0 comments on commit ad71961

Please sign in to comment.