Gantt task end date calculator
A five-calendar-day task that starts on Thursday 23 July 2026 ends on Monday 27 July, because the start day counts as day one. Switch to working days to skip Saturdays and Sundays. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Start date
- 2026-07-23
- Duration
- 5
- Duration unit
- Calendar
- Effective start
- 2026-07-23
- End date
- 2026-07-27
- Weekday
- Monday
- Iso weekday
- 1
A Gantt chart is only as trustworthy as the finish date on every bar. Project managers, schedulers, and delivery leads convert a task start date plus a duration into a last occupied day before they draw a timeline, set a predecessor, or promise a milestone. This Gantt task end date calculator accepts a strict ISO start date, a positive integer duration, and a duration unit of calendar or working days, then returns the inclusive finish date, the effective first working day when weekends are skipped, the weekday of the end, the calendar span of the bar, and how many weekend days were stepped over.
Inclusive Gantt duration versus a plain date offset
Gantt software treats duration as an inclusive occupation, not as an exclusive offset you add after the start. A five-day task that starts on Monday occupies Monday through Friday and finishes on Friday, not the following Monday. That convention is the difference between a scheduling chart and a generic date-plus-N helper, and it is the rule this calculator applies in both units.
Public holidays are intentionally out of scope: they vary by country, region, and company calendar, and baking one table into a generic Gantt helper would silently wrong teams that observe a different list. Pair the finish date with your own holiday calendar when a mid-week public holiday should push the bar. Leap days are real Gregorian dates: the twenty-ninth of February in a leap year is valid and the same civil date in a common year is rejected.
Where a Gantt task end date calculator earns its keep
Project managers and PMO analysts use a Gantt task end date calculator when they sketch a schedule before the file lives in Microsoft Project, Primavera, or a spreadsheet Gantt: they need the last occupied day of a five-working-day build, a ten-calendar-day review, or a one-day milestone so the next bar can start the following working day. Construction and plant-maintenance planners convert a permit start plus a working-day duration into a site-ready finish that does not land on Saturday.
Software delivery leads check whether a sprint-length task that starts on Friday really ends next Thursday once weekends are skipped, then lock that finish into a roadmap slide. Training courses and LMS plugins need a deterministic oracle that rejects a duration of zero or a February thirtieth instead of silently emitting an invalid chart. Failed validation does not consume balance.
What you can do with it
Draw a Gantt bar from start and duration
Convert a task start date plus an inclusive duration in calendar or working days into the last occupied day so the bar you plot on a scheduling chart ends on the correct Friday or Monday.
Friday starts and weekend-aware finishes
Check a working-day task that begins on Friday: five working days occupy Friday plus the next Monday through Thursday, and the calculator reports the weekend days it skipped.
Automate finish dates in planning notebooks
Call the same inclusive rule from scripts and CI so roadmaps, permit logs, and delivery reports share one finish date instead of mixing exclusive date-plus-N helpers.
FAQ
How is a Gantt task end date calculated?
Duration is inclusive. A 5-day task occupies five days of the chosen unit and finishes on the last of those days.
What is the difference between calendar and working days?
calendar counts every civil day, including Saturday and Sunday. working counts Monday through Friday only and skips weekends. Public holidays are not applied; pair the result with your own holiday list when needed.
What if the start date is a weekend?
In calendar mode the weekend day is occupied.
Does a five-working-day task that starts Monday end the next Monday?
No. Inclusive Gantt duration occupies Monday through Friday, so the end date is Friday. An exclusive date-plus-five helper would land on the following Monday and would mis-draw the bar.
Are public holidays skipped?
No. Working-day mode skips only Saturdays and Sundays, because holiday lists differ by country, region and company. If a public holiday falls mid-week, push the finish date yourself using your own calendar.
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/biz/gantt-task-end \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"start_date":"2026-07-20","duration":5,"duration_unit":"working"}'const res = await fetch("https://api.kit.forhosting.com/biz/gantt-task-end", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"start_date": "2026-07-20",
"duration": 5,
"duration_unit": "working"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/biz/gantt-task-end",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"start_date": "2026-07-20",
"duration": 5,
"duration_unit": "working"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/biz/gantt-task-end", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"start_date":"2026-07-20","duration":5,"duration_unit":"working"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"start_date":"2026-07-20","duration":5,"duration_unit":"working"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/biz/gantt-task-end", 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_date": "2026-07-20",
"duration": 5,
"duration_unit": "working"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "biz.gantt_task_end",
"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.
Limits
max_duration | 10000 |
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
Invalid dates, non-positive durations, and unknown units fail with invalid_input and are not billed.
Inclusive Gantt duration versus a plain date offset
A one-day task starts and ends on the same calendar date: the bar occupies that single day. When duration_unit is calendar, every civil day counts, including Saturday and Sunday, so a five-day bar that starts on Thursday finishes on Monday. When duration_unit is working, only Monday through Friday count; Saturdays and Sundays are stepped over and reported in weekend_days_skipped. If the requested start_date falls on a weekend in working mode, the first occupied day is the next Monday and that date is returned as effective_start so the bar you draw matches the days that actually consume capacity.
Input contract, response shape, and error behaviour
Because the walk never consults a local timezone, a date that is already a pure calendar value in your pipeline does not slip by a day when an isolate runs in another zone. POST a JSON body with three required fields. start_date is a strict ISO calendar string YYYY-MM-DD and must be a real Gregorian date; aliases start and date are accepted. duration is a positive integer from one to ten thousand inclusive days of the chosen unit; aliases days and length are accepted. duration_unit is an enum of calendar or working; aliases unit and mode are accepted. Missing fields, empty strings, non-canonical padding, impossible days such as the thirty-first of April, a duration of zero or a fraction, and any unit other than calendar or working fail with invalid_input naming the field. On success the body echoes start_date, duration, and duration_unit, then returns effective_start (the first occupied day, which equals start_date unless working mode had to skip a weekend), end_date (the last occupied day of the inclusive bar), weekday and iso_weekday of the finish (Monday equals one through Sunday equals seven), is_weekend of the finish, calendar_span as the inclusive civil-day length from effective_start to end_date, weekend_days_skipped, and a formula string that restates the inclusive rule for the chosen unit. Use end_date as the system of record on the chart; use weekday in user-facing copy. Pair the numeric result with predecessor lags, percent-complete, and resource calendars outside this endpoint; the calculator returns the finish of one bar only and does not emit a full project file.
Where a Gantt task end date calculator earns its keep
Keep requests small, pin end_date and calendar_span in tests, and you get reproducible finishes for scheduling charts, edge workers, and CI checks without standing up a full project-portfolio stack of your own.
Technical questions
What does the Gantt task end date calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.