I shipped a settlement-date bug that only appeared on a Friday in July. The date was 3 July 2026, the day before Independence Day, which falls on a Saturday that year. My function marked that Friday as a bank holiday because that's what most "US federal holiday" libraries do. Federal offices are closed. Federal Reserve Banks are not.
If you calculate ACH or Fedwire settlement dates, you need the Reserve Bank calendar, not the Office of Personnel Management calendar. They diverge whenever a holiday lands on a Saturday.
What a US banking day actually is
For payments, a US banking day is a weekday when Federal Reserve Banks are open to operate FedACH and Fedwire. Retail branch hours are a separate question, and the Board of Governors in Washington can close on a Friday when the Reserve Banks themselves stay open. I care about the Banks, because that's when settlement happens.
The official list is published by Federal Reserve Financial Services. I used that 2026–2027 schedule rather than generating dates from rules of thumb. The eleven holidays are New Year's Day, Martin Luther King Jr. Day, Washington's Birthday (Presidents Day), Memorial Day, Juneteenth, Independence Day, Labor Day, Columbus Day, Veterans Day, Thanksgiving, and Christmas.
The observed-date rules that trip people up
The footnotes on that schedule are the whole game:
- If a holiday falls on Saturday, Federal Reserve Banks and Branches will be open the preceding Friday.
- If a holiday falls on Sunday, Federal Reserve Banks and Branches will be closed the following Monday.
The first rule is the opposite of the federal-employee convention, where Saturday holidays are usually observed on Friday. The Fed does not shift that closure. Friday stays a banking day. Saturday is already a weekend, so there is no weekday closure at all.
2026 and 2027 are a useful test pair because they hit both cases.
In 2026, Independence Day is Saturday, 4 July, so Friday, 3 July is a banking day. The other ten holidays fall on weekdays, which means ten weekday closures: 1 January, 19 January, 16 February, 25 May, 19 June, 7 September, 12 October, 11 November, 26 November, and 25 December.
In 2027, Juneteenth is Saturday, 19 June, and Christmas is Saturday, 25 December. Friday, 18 June and Friday, 24 December are banking days for the Reserve Banks. Independence Day is Sunday, 4 July, so the Banks close Monday, 5 July. That leaves nine weekday closures: 1 January, 18 January, 15 February, 31 May, 5 July, 6 September, 11 October, 11 November, and 25 November.
The Board of Governors does close on those Fridays — 3 July 2026, 18 June 2027, and 24 December 2027 — but Board staff being off does not stop FedACH or Fedwire. The Board's K.8 schedule spells out that distinction.
What this means for ACH settlement
Nacha settlement follows Federal Reserve banking days. If the date you would have settled on is a weekend or a Reserve Bank holiday, settlement moves to the next banking day.
That is why the two Independence Day weekends behave differently. Originate a next-day ACH on Thursday, 2 July 2026, and Friday, 3 July is a valid settlement day. Do the same on Friday, 2 July 2027, and Monday, 5 July is closed, so settlement lands on Tuesday, 6 July.
FedACH also publishes processing windows around each holiday. For 2026, processing for Independence Day ends Friday, 3 July at 11:30 p.m. ET and resumes Sunday, 5 July at 5:30 p.m. ET — even though Friday is a banking day. A banking day is necessary for settlement; it is not a reason to ignore cutoff times. The same idea applies when the holiday itself is a Friday, as with Juneteenth 2026 (19 June) and Christmas 2026 (25 December): no settlement that day, and processing resumes Sunday evening for the next banking day.
A small function
I keep the statutory dates from the official schedule and apply the Saturday/Sunday rules, rather than hard-coding only the closure dates. The list stays honest to the source, and the rule stays visible in the code. I treat dates as ISO strings and format them in local time, so a UTC conversion does not slip a date across midnight.
// Statutory dates: Federal Reserve Financial Services holiday schedule,
// 2026–2027. https://www.frbservices.org/about/holiday-schedules
const FED_HOLIDAYS = [
"2026-01-01", // New Year's Day (Thu)
"2026-01-19", // Martin Luther King Jr. Day (Mon)
"2026-02-16", // Washington's Birthday (Mon)
"2026-05-25", // Memorial Day (Mon)
"2026-06-19", // Juneteenth (Fri)
"2026-07-04", // Independence Day (Sat) — Banks open Friday
"2026-09-07", // Labor Day (Mon)
"2026-10-12", // Columbus Day (Mon)
"2026-11-11", // Veterans Day (Wed)
"2026-11-26", // Thanksgiving Day (Thu)
"2026-12-25", // Christmas Day (Fri)
"2027-01-01", // New Year's Day (Fri)
"2027-01-18", // Martin Luther King Jr. Day (Mon)
"2027-02-15", // Washington's Birthday (Mon)
"2027-05-31", // Memorial Day (Mon)
"2027-06-19", // Juneteenth (Sat) — Banks open Friday
"2027-07-04", // Independence Day (Sun) — Banks closed Monday
"2027-09-06", // Labor Day (Mon)
"2027-10-11", // Columbus Day (Mon)
"2027-11-11", // Veterans Day (Thu)
"2027-11-25", // Thanksgiving Day (Thu)
"2027-12-25", // Christmas Day (Sat) — Banks open Friday
];
function toIso(d) {
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, "0");
const day = String(d.getDate()).padStart(2, "0");
return `${y}-${m}-${day}`;
}
function addDays(iso, n) {
const d = new Date(`${iso}T12:00:00`);
d.setDate(d.getDate() + n);
return toIso(d);
}
function weekday(iso) {
return new Date(`${iso}T12:00:00`).getDay(); // 0 Sun … 6 Sat
}
function fedClosureDates(holidays) {
const closed = new Set();
for (const iso of holidays) {
const dow = weekday(iso);
if (dow === 6) continue; // Saturday: Friday stays open
if (dow === 0) {
closed.add(addDays(iso, 1)); // Sunday → closed Monday
continue;
}
closed.add(iso);
}
return closed;
}
const CLOSED = fedClosureDates(FED_HOLIDAYS);
function isUsBankingDay(iso) {
const dow = weekday(iso);
if (dow === 0 || dow === 6) return false;
return !CLOSED.has(iso);
}
function nextUsBankingDay(iso) {
let d = addDays(iso, 1);
while (!isUsBankingDay(d)) d = addDays(d, 1);
return d;
}
I run a few assertions whenever I touch this: 2026-07-03 is a banking day, as are 2027-06-18 and 2027-12-24. 2027-07-05 is not, because the Sunday holiday is observed on Monday. Friday holidays such as 2026-06-19 and 2026-12-25 are closed. And nextUsBankingDay("2027-07-02") should return 2027-07-06.
If you want a day-by-day view of whether US banks are open, including these weekend-holiday cases, that is a useful check. I still treat the Federal Reserve schedule as the source of truth, and I re-check it when a new year is published.
This list covers 2026 and 2027 only. Don't extrapolate the Saturday rule onto a date the Fed has not published, and don't reuse this calendar for stock-market holidays or for whether a particular branch is open at 4 p.m. Those are different schedules.
I'm Abdul Hannan, a developer based in the UAE. I got this wrong once. I'd rather the next function I write start from the Reserve Bank footnotes.
Top comments (0)