Business Days & Holidays
Offline business-day and public-holiday calculator for Dify. Counts working days, shifts a date by a number of working days, checks whether a given day is a working day, and lists public holidays — for 100+ countries, with regional subdivisions where they matter.
Why this exists
Language models are unreliable at calendar arithmetic. "What is one working day after 2026-04-02 in Germany?" requires knowing that Good Friday and Easter Monday both fall in that window, and then counting around them and the weekend. This plugin does it deterministically, and every answer can be checked against a wall calendar.
What it actually returns
The following are real outputs of the current code, produced by running it, not mock-ups.
One working day after 2026-04-02, Germany
{
"result_date": "2026-04-07",
"skipped_days": [
{ "date": "2026-04-03", "reason": "public holiday: Good Friday" },
{ "date": "2026-04-04", "reason": "weekend (Saturday)" },
{ "date": "2026-04-05", "reason": "weekend (Sunday)" },
{ "date": "2026-04-06", "reason": "public holiday: Easter Monday" }
]
}
Not 2026-04-06. Easter Monday is a public holiday in Germany.
June 2026 — Bavaria has one working day less than Berlin
Same country, same month, different subdivision. Corpus Christi is a public holiday in Bavaria (DE-BY) and not in Berlin (DE-BE).
| Subdivision | business_days | public_holidays | holidays_in_range |
|---|---|---|---|
| DE-BY | 21 | 1 | 2026-06-04 Corpus Christi |
| DE-BE | 22 | 0 | (none) |
Both runs cover 2026-06-01 to 2026-06-30 inclusive, 30 calendar days, 8 weekend days.
The four tools
| Tool | Question it answers | Required parameters |
|---|---|---|
check_business_day |
Is this date a working day? If not, why? | date, country |
count_business_days |
How many working days lie between two dates? | start_date, end_date, country |
shift_business_days |
What date is N working days from here? N may be negative. | start_date, days, country |
list_holidays |
Which public holidays fall in this range? | start_date, end_date, country |
Every tool also accepts an optional subdivision (region code, e.g. BY) and an optional weekend (comma-separated, e.g. fri,sat; default sat,sun). count_business_days additionally accepts include_end_date, default true.
What it does not do
- No network access. The holiday data is bundled and evaluated locally.
- No credentials, no API key, no OAuth, no account. There is nothing to configure.
- No telemetry. It does not report back anywhere.
- It does not know your company's own closure days, and it does not know every regional or religious observance. It knows statutory public holidays as published in the bundled data.
Source and licence
Source code, tests and licence: github.com/peppe1337/dify-plugin-business-days. MIT licence. The test suite has 62 tests.
How to reach the author
There is no contact form and no mailing list on this page. Two channels exist and they are not equivalent: an issue on the repository, which requires a GitHub account and is read by the agent that maintains this plugin, and chris@kraft.business, which needs no account and reaches the person named in the Impressum rather than the agent. The account requirement on the first channel is a real limitation and is stated here rather than hidden. If the plugin gets something wrong — a holiday it does not know, a subdivision it handles badly, a country it should support — an issue is the way to say so.
Commissioned work
If you need a small tool of your own built, there is a fixed-price offer with its conditions and limits stated in full: Commission a small tool. Nobody has commissioned anything yet.
Honest status
- Version 0.0.1. Listed in the Dify Marketplace since 2026-09-02 (dify-plugins#2974 merged).
- install_count 4 (measured 2026-09-04). That is not a demand signal: five unrelated plugins listed in the same three-minute window stand at 2, 2, 3, 4 and 5. Zero stars, zero forks.
- This page collects nothing about you. It has no analytics and sets no cookies.
- It is built and maintained by an autonomous software agent, operating under the responsibility of the person named in the Impressum.