0diff --git i/src/test/util_tests.cpp w/src/test/util_tests.cpp
1index 387493152d..ebb40dd713 100644
2--- i/src/test/util_tests.cpp
3+++ w/src/test/util_tests.cpp
4@@ -384,15 +384,23 @@ BOOST_AUTO_TEST_CASE(util_FormatISO8601Date)
5 BOOST_CHECK_EQUAL(FormatISO8601Date(0), "1970-01-01");
6 BOOST_CHECK_EQUAL(FormatISO8601Date(1317425777), "2011-09-30");
7 }
8
9 BOOST_AUTO_TEST_CASE(util_FormatRFC7231DateTime)
10 {
11+ BOOST_CHECK_EQUAL(FormatRFC7231DateTime(std::numeric_limits<int64_t>::max()), "");
12+ BOOST_CHECK_EQUAL(FormatRFC7231DateTime(253402300800), "");
13+ BOOST_CHECK_EQUAL(FormatRFC7231DateTime(253402300799), "Fri, 31 Dec 9999 23:59:59 GMT");
14 BOOST_CHECK_EQUAL(FormatRFC7231DateTime(253402214400), "Fri, 31 Dec 9999 00:00:00 GMT");
15 BOOST_CHECK_EQUAL(FormatRFC7231DateTime(1717429609), "Mon, 03 Jun 2024 15:46:49 GMT");
16 BOOST_CHECK_EQUAL(FormatRFC7231DateTime(0), "Thu, 01 Jan 1970 00:00:00 GMT");
17+ BOOST_CHECK_EQUAL(FormatRFC7231DateTime(-1), "Wed, 31 Dec 1969 23:59:59 GMT");
18+ BOOST_CHECK_EQUAL(FormatRFC7231DateTime(-1717429609), "Sat, 31 Jul 1915 08:13:11 GMT");
19+ BOOST_CHECK_EQUAL(FormatRFC7231DateTime(-62167219200), "Sat, 01 Jan 0000 00:00:00 GMT");
20+ BOOST_CHECK_EQUAL(FormatRFC7231DateTime(-62167219201), "");
21+ BOOST_CHECK_EQUAL(FormatRFC7231DateTime(std::numeric_limits<int64_t>::min()), "");
22 }
23
24 BOOST_AUTO_TEST_CASE(util_FormatMoney)
25 {
26 BOOST_CHECK_EQUAL(FormatMoney(0), "0.00");
27 BOOST_CHECK_EQUAL(FormatMoney((COIN/10000)*123456789), "12345.6789");
28diff --git i/src/util/time.cpp w/src/util/time.cpp
29index 9b9167d19a..c0f375956a 100644
30--- i/src/util/time.cpp
31+++ w/src/util/time.cpp
32@@ -7,21 +7,22 @@
33
34 #include <compat/compat.h>
35 #include <tinyformat.h>
36 #include <util/check.h>
37 #include <util/strencodings.h>
38
39+#include <array>
40 #include <atomic>
41 #include <chrono>
42 #include <optional>
43 #include <string>
44 #include <string_view>
45 #include <thread>
46
47-static const std::string weekdays[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
48-static const std::string months[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
49+static constexpr std::array<std::string_view, 7> weekdays{"Thu", "Fri", "Sat", "Sun", "Mon", "Tue", "Wed"}; // 1970-01-01 was a Thursday.
50+static constexpr std::array<std::string_view, 12> months{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
51
52 void UninterruptibleSleep(const std::chrono::microseconds& n) { std::this_thread::sleep_for(n); }
53
54 static std::atomic<std::chrono::seconds> g_mock_time{}; //!< For testing
55 std::atomic<bool> g_used_system_time{false};
56 static std::atomic<std::chrono::milliseconds> g_mock_steady_time{}; //!< For testing
57@@ -116,20 +117,24 @@ std::optional<int64_t> ParseISO8601DateTime(std::string_view str)
58 }
59 const auto time{std::chrono::hours{*hour} + std::chrono::minutes{*min} + std::chrono::seconds{*sec}};
60 const auto tp{std::chrono::sys_days{ymd} + time};
61 return int64_t{TicksSinceEpoch<std::chrono::seconds>(tp)};
62 }
63
64-std::string FormatRFC7231DateTime(int64_t nTime)
65+std::string FormatRFC7231DateTime(int64_t time)
66 {
67- const std::chrono::sys_seconds secs{std::chrono::seconds{nTime}};
68+ if (time < -62167219200 || 253402300799 < time) {
69+ // RFC7231 mandates 4-digit year, so only support years 0 to 9999
70+ return "";
71+ }
72+ const std::chrono::sys_seconds secs{std::chrono::seconds{time}};
73 const auto days{std::chrono::floor<std::chrono::days>(secs)};
74- // 1970-01-01 was a Thursday
75- std::string_view weekday{weekdays[(days.time_since_epoch().count() + 4) % 7]};
76+ const auto w{days.time_since_epoch().count() % 7}; // will be in the range [-6, 6]
77+ std::string_view weekday{weekdays.at(w >= 0 ? w : w + 7)};
78 const std::chrono::year_month_day ymd{days};
79- std::string_view month{months[unsigned{ymd.month()} - 1]};
80+ std::string_view month{months.at(unsigned{ymd.month()} - 1)};
81 const std::chrono::hh_mm_ss hms{secs - days};
82 // examples: Mon, 27 Jul 2009 12:28:53 GMT
83 // Fri, 31 May 2024 19:18:04 GMT
84 return strprintf("%03s, %02u %03s %04i %02i:%02i:%02i GMT", weekday, unsigned{ymd.day()}, month, signed{ymd.year()}, hms.hours().count(), hms.minutes().count(), hms.seconds().count());
85 }
86