How to Calculate Working Days in a Project Schedule (Without Mistakes)
"How many days will this take?" The wrong answer destroys deadlines. Here's the right way to think about working days, weekends, and holidays — with examples and a free tool that does the math for you.
-->The core distinction
Two terms get mixed up constantly:
- Calendar days: counts everything — Mondays, Saturdays, Christmas. Useful for "the contract is due 30 days from now."
- Working days (business days): counts only days when work actually happens — typically Monday–Friday, excluding holidays.
Confusing them is one of the most common scheduling mistakes. A "5-day task" that you mean as 5 working days but enter as 5 calendar days will be off by 2 days every weekend it crosses.
The right formula
For a task starting on date S with duration D working days:
Finish date = S + (D − 1) business days
Why (D − 1)? Because the start day counts as day 1. If a task takes 1 working day and starts Monday, it finishes Monday — not Tuesday.
Example 1
- Start: Friday, 2026-04-10
- Duration: 3 working days
- Day 1: Fri 4/10
- Day 2: Mon 4/13 (skipped Sat/Sun)
- Day 3: Tue 4/14
- Finish: Tuesday, 2026-04-14
Example 2
- Start: Wednesday, 2026-04-15
- Duration: 10 working days
- 4/15 (Wed) through 4/28 (Tue) — 10 working days, skipping two weekends
- Finish: Tuesday, 2026-04-28
Notice: 10 working days = 14 calendar days because of two weekends. This gap is the source of most "wait, why is this taking so long?" surprises.
Handling start dates on weekends
What if the calculated start lands on a Saturday or Sunday? Roll forward to the next Monday.
Example 3
- Predecessor finishes: Friday, 2026-04-10
- Successor's natural start: Saturday, 2026-04-11
- Adjusted start: Monday, 2026-04-13
This is the default behavior of GanttBuilder and most professional Gantt tools. It mirrors how real projects work — nobody starts a Monday task on a Saturday morning.
The holiday problem
Weekends are easy because they're consistent. Holidays are harder because:
- They vary by country, region, and even company
- Some are fixed-date (July 4), some are moving (Memorial Day, Labor Day)
- Some companies observe Christmas Eve, some don't
- "Floating" holidays add another layer (some companies grant 1-2 days/year that employees pick)
Most simple Gantt tools don't auto-skip holidays. The workarounds:
Option A — Manual buffer
Add 1 day to any task that crosses a known holiday. Simple but easy to forget.
Option B — Calendar review at planning
Identify the 5-10 major holidays in your project span. Mark them. Adjust durations during plan creation, not after.
Option C — Holiday buffer per phase
Add 5-10% to each phase's total duration as a holiday buffer. Less precise but catches the cumulative effect.
Option D — Track in a separate column
Keep a "Holiday Adjustment" column in your CSV. Recompute as holidays approach.
For projects under 3 months in a single country, Option A is fine. Longer projects or multi-region teams need Options B or C.
-->Working days across cultures
"Working day" isn't universal:
- Most of the world: Mon-Fri are working days; Sat-Sun off
- Israel: Sun-Thu are working days; Fri-Sat off (Shabbat)
- Many Middle Eastern countries (historically): Sun-Thu; recently shifting to Mon-Fri or Mon-Sat
- Some retail/construction: 6-day week (Mon-Sat); only Sun off
- Some industries (process plants, hospitals): no weekends — 7-day operation
If your project crosses regions, agree on which calendar to use. Default to "Mon-Fri, party with the highest impact's region."
Common formulas
Excel / Google Sheets
=WORKDAY(start_date, duration_days - 1)
=WORKDAY.INTL(start_date, duration_days - 1, weekend_pattern, [holidays_range])
=NETWORKDAYS(start, end) ← inverse: calendar dates → working day count
WORKDAY.INTL lets you specify a custom weekend pattern (e.g., "0000110" for Mon-Fri) and a list of holidays.
Python
import numpy as np
finish = np.busday_offset(start, duration - 1, roll='forward')
count = np.busday_count(start, finish + 1) # inverse
Add holidays=[...] to skip dates.
JavaScript
No built-in. You write a loop or use a library (date-fns, dayjs with plugins). GanttBuilder ships its own ~20-line function for this.
Mistakes to avoid
1. Confusing "5 days" with "1 week"
A 5-working-day task takes 7 calendar days (1 weekend). A 10-working-day task takes 14 calendar days. The difference matters when reporting to clients who think in calendar weeks.
2. Letting tasks "spill" into weekends silently
If your tool calculates dates on a calendar-day basis, a task ending Friday plus 1 calendar day starts Saturday. People won't be there.
3. Ignoring half-days
The Friday before a major holiday is often a half-day. A task that needs a full Friday will spill into the next week.
4. Double-counting the start day
"It takes 3 days, starting Monday" — finish Wednesday, not Thursday. Off-by-one errors compound across a 50-task project.
5. Forgetting that "approval" tasks aren't yours
If a client takes 5 days to review a deliverable, that's 5 days of their working calendar. They may have different holidays than you.
How GanttBuilder handles it
The tool's approach in one paragraph:
Every duration is treated as working days. Weekends are skipped automatically. If a calculated start lands on a weekend, it rolls forward to the next Monday. Holidays must be handled manually (add 1-2 days to crossing tasks). Each task's start = next business day after the latest predecessor finishes. Multi-predecessor tasks wait for the latest.
To see this in action, open the tool and load the sample. Notice that "Drawing Approval" starts on a Monday — even though the predecessor finishes on a Friday and you might expect Saturday.
Practical advice
- Pick "working days" as your default unit. Don't mix units within a project.
- List major holidays at the start of planning. Don't discover them mid-project.
- Add a 10% buffer for any project spanning more than 2 months. Holidays, sick days, and "stuff that comes up" eat schedule.
- Re-check working-day math at every major milestone. If reality deviates from the plan by 3+ days, recalculate the rest, don't extrapolate.