From c1d430e61ab306e0e1d454fea6e07b4f66667a65 Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Sat, 4 May 2019 16:33:17 -0700 Subject: [PATCH] Improve handling of negative durations --- include/fmt/chrono.h | 13 ++++++++----- test/chrono-test.cc | 4 ++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/include/fmt/chrono.h b/include/fmt/chrono.h index 9de56df9..39369add 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 8965af92..573606d8 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