Project business days calculator
From Monday 6 July to Friday 10 July 2026 a project has 5 business days, and listing 8 July as a holiday leaves 4. Enter a start, an end and your closures to get the working-day total. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Start
- 2026-07-06
- End
- 2026-07-10
- Business days
- 5
- Calendar days
- 5
- Weekend days
- 0
- Holidays excluded
- 0
Project schedules almost never mean raw calendar days. When a statement of work promises thirty working days from kickoff, or a client asks how many billable days sit between two milestones, weekend gaps and public holidays quietly distort any naive subtraction of two ISO dates. This project business days calculator accepts a project start date, a project end date, and an optional list of holiday dates, then returns the inclusive count of Monday-through-Friday days that remain after those holidays are removed.
What a project business day means in this calculator
A project business day is any Gregorian calendar day that falls on Monday, Tuesday, Wednesday, Thursday, or Friday and is not listed in the optional holidays array. The range is inclusive: if the start date is a weekday and not a holiday, it counts as day one of the project window; if the end date is likewise a working day, it counts as well. Saturdays and Sundays never count, even when they sit inside a long multi-month engagement.
Holiday dates that land on a weekend do not change the total further, because those days were already excluded as weekends; only holidays that fall on a weekday reduce the business-day total, and those dates appear in the holidays list of the response so auditors can see exactly which non-working weekdays were applied.
Where project business-day counts earn their keep
Delivery teams use a project business days calculator when translating contractual working-day durations into calendar end dates in reverse, or when measuring how many billable days already elapsed between kickoff and a status review. Product managers planning sprints need inclusive weekday counts that ignore company holidays listed once per region. Finance and professional-services ops reconcile timesheets against the theoretical maximum working days in a billing period without opening a desktop spreadsheet for every client.
What you can do with it
Contract and SOW working-day windows
Measure inclusive business days between project kickoff and contractual end, subtracting weekends and the holiday list named in the statement of work.
Sprint and billing period capacity
Compute the maximum weekday capacity of a sprint or monthly billing period so planners and finance share the same working-day total.
SLA and milestone elapsed time
Report how many working days have elapsed between two milestones for status reports, without counting Saturdays, Sundays, or listed closures.
FAQ
How do I count project business days between two dates?
Send start and end as YYYY-MM-DD. Optionally pass holidays as an array of the same form.
What if a holiday falls on a weekend?
Weekend holidays do not change the total further.
Are the start and end dates counted?
Yes. The window is inclusive, so the first and last day each count as a business day when they fall on a weekday and are not on your holiday list.
What happens if I enter the end date before the start date?
The calculator refuses the pair instead of swapping the dates. A project window that runs backwards is almost always a typing mistake, and it is better to notice it than to get a silent answer.
Can I paste the same holiday twice?
Yes, duplicates are ignored, so a holiday listed twice only removes one day. The result also lists the weekday holidays that were taken off, so anyone reviewing the count can see them.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/date/business-days-project \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"start":"2026-07-06","end":"2026-07-31"}'const res = await fetch("https://api.kit.forhosting.com/date/business-days-project", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"start": "2026-07-06",
"end": "2026-07-31"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/business-days-project",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"start": "2026-07-06",
"end": "2026-07-31"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/business-days-project", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"start":"2026-07-06","end":"2026-07-31"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"start":"2026-07-06","end":"2026-07-31"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/business-days-project", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"start": "2026-07-06",
"end": "2026-07-31"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.business_days_project",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Failed validation is not billed; successful calls use the published $0.002 base price with no model tokens and no outbound network.
What a project business day means in this calculator
The algorithm walks each civil day from start through end using pure arithmetic: serial day numbers follow Howard Hinnant days_from_civil, weekdays follow the Sakamoto method, and leap years follow the standard Gregorian rule that centuries are leap only when divisible by four hundred.
Input contract, response fields, and error behaviour
Optional holidays is an array of the same date strings; omit it or pass an empty array when the project has no non-weekend closures. Each date is validated as a real Gregorian day, including February twenty-ninth only in leap years, so 2023-02-29 is rejected while 2024-02-29 is accepted. Example: start 2026-07-06 (Monday) and end 2026-07-10 (Friday) with no holidays yields five business days, five calendar days, and zero weekend days. The same week with holidays containing 2026-07-08 yields four business days and one entry in holidays. POST a JSON body with start and end as required ISO-8601 calendar strings in the form YYYY-MM-DD. Aliases are accepted for convenience: from, begin, and project_start map to start; to, finish, and project_end map to end. Start must be on or before end; a reversed pair fails with invalid_input rather than silently swapping bounds, because a project window with an inverted timeline is almost always a data-entry bug worth surfacing. On success the body returns the normalized start and end strings, business_days as the inclusive working-day count, calendar_days as the inclusive span of all days, weekend_days as the count of Saturdays and Sundays inside the span, holidays_excluded as the number of weekday holidays that actually reduced the total, holidays as the sorted list of those weekday holidays that fell inside the range, and a short formula string describing the rule. Invalid or missing dates, a non-array holidays value, or a start after end all raise invalid_input and are not billed.
Where project business-day counts earn their keep
Keep requests small, pin business_days in integration tests, and you get reproducible project windows for Gantt tools, SLA engines, invoice previews, and edge workers without standing up a full calendar service of your own.
Technical questions
Are the start and end dates included?
Yes. Both bounds are inclusive: if start or end is a weekday and not a listed holiday, it contributes one to business_days.
Can start be after end?
No. The task fails with invalid_input when start is after end so inverted project windows are not silently swapped.
What does the project business days calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.