diff --git a/include/fmt/chrono.h b/include/fmt/chrono.h index a1c13483..66a2fb72 100644 --- a/include/fmt/chrono.h +++ b/include/fmt/chrono.h @@ -1681,7 +1681,7 @@ struct duration_formatter { auto hour12() const -> Rep { Rep hour = static_cast(mod((s.count() / 3600), 12)); - return hour <= 0 ? 12 : hour; + return hour < 1 ? 12 : hour; } auto minute() const -> Rep { diff --git a/test/chrono-test.cc b/test/chrono-test.cc index d9ea18a1..2c54febb 100644 --- a/test/chrono-test.cc +++ b/test/chrono-test.cc @@ -507,6 +507,15 @@ TEST(chrono_test, format_specs) { EXPECT_EQ(fmt::format("{:%q}", std::chrono::seconds(12345)), "s"); } +TEST(chrono_test, format_12_hour_fp) { + using seconds = std::chrono::duration; + EXPECT_EQ(fmt::format("{:%I:%M:%S %p}", seconds(1)), "12:00:01 AM"); + EXPECT_EQ(fmt::format("{:%I:%M:%S %p}", seconds(43201)), "12:00:01 PM"); + EXPECT_EQ(fmt::format("{:%I}", seconds(3599)), "12"); + EXPECT_EQ(fmt::format("{:%I}", seconds(3600)), "01"); + EXPECT_EQ(fmt::format("{:%I}", seconds(86401)), "12"); +} + TEST(chrono_test, invalid_specs) { auto sec = std::chrono::seconds(0); EXPECT_THROW_MSG((void)fmt::format(runtime("{:%a}"), sec), fmt::format_error,