diff --git a/include/fmt/chrono.h b/include/fmt/chrono.h index 9de56df9a15d..39369addd7ce 100644 --- a/include/fmt/chrono.h +++ b/include/fmt/chrono.h @@ -430,11 +430,14 @@ struct chrono_formatter { explicit chrono_formatter(FormatContext& ctx, OutputIt o, std::chrono::duration d) - : context(ctx), - out(o), - val(d.count()), - s(std::chrono::duration_cast(d)), - ms(std::chrono::duration_cast(d - s)) {} + : context(ctx), out(o), val(d.count()) { + if (d.count() < 0) { + d = -d; + *out++ = '-'; + } + s = std::chrono::duration_cast(d); + ms = std::chrono::duration_cast(d - s); + } int hour() const { return to_int(mod((s.count() / 3600), 24)); } diff --git a/test/chrono-test.cc b/test/chrono-test.cc index 8965af92f78e..573606d8dbdf 100644 --- a/test/chrono-test.cc +++ b/test/chrono-test.cc @@ -310,4 +310,8 @@ TEST(ChronoTest, LargeDuration) { EXPECT_EQ("40", fmt::format("{:%S}", std::chrono::duration(1e20))); } +TEST(ChronoTest, NegativeDuration) { + EXPECT_EQ("-00:01", fmt::format("{:%M:%S}", std::chrono::duration(-1))); +} + #endif // FMT_STATIC_THOUSANDS_SEPARATOR