Whether you're tracking a project deadline, calculating the duration of a contract, or simply counting down to a vacation, date calculations are something nearly everyone encounters. Despite seeming straightforward, computing the exact number of days between two dates—or adding days while accounting for weekends, holidays, and leap years—can get surprisingly tricky.
This guide walks through everything you need to know about date math: from simple day-counting formulas to working-day calculations, complete with copy-paste code examples in JavaScript, Python, and Excel.
Table of Contents
- TL;DR
- Introduction
- How to Calculate Days Between Two Dates
- How to Add or Subtract Days from a Date
- Working Days Calculator: Excluding Weekends and Holidays
- Date Math Across Time Zones
- Date Calculation in Different Scenarios
- Frequently Asked Questions
- Conclusion
TL;DR
- Days between two dates: Subtract the two dates and convert the result to days. In JavaScript, divide the millisecond difference by
86400000. In Python, subtract twodateobjects to get atimedelta. In Excel, subtract one cell from another. - Add/subtract days: Use
setDate()in JavaScript,timedeltain Python, or simple addition in Excel. - Working days: Exclude weekends (and optionally holidays) from the total. Use Excel's
NETWORKDAYSfunction or iterate through dates in code. - Time zones: Always normalize to UTC before performing date arithmetic to avoid off-by-one errors caused by Daylight Saving Time transitions.
- Skip the manual math: Use the Date Calculator for instant, accurate results.
Introduction
Date calculations appear everywhere in software development and daily life. A project manager needs to know how many working days remain before a release. A lawyer must determine whether a statute of limitations has expired. A finance team calculates accrued interest based on exact day counts. Even planning a birthday party requires counting the days until the big event.
While the concept is simple—how many days from A to B—the implementation details matter. Months have varying lengths (28, 29, 30, or 31 days). Leap years add an extra day to February. Time zones can shift a date forward or backward. Business-day calculations need to exclude weekends and holidays that vary by country.
This guide covers the core techniques for performing date calculations accurately, with practical code examples you can use immediately. If you need a quick answer without writing code, the Date Calculator handles all of this in your browser.
How to Calculate Days Between Two Dates
The Basic Formula
The fundamental approach to finding the number of days between two dates is:
Days = End Date − Start Date
In most programming environments, dates are represented internally as numbers (milliseconds since the Unix epoch in JavaScript, ordinal days in Python, serial numbers in Excel). Subtracting two date values gives you the raw difference, which you then convert to days.
Key considerations:
- Inclusive vs. exclusive counting — Does "from January 1 to January 3" equal 2 days or 3 days? It depends on whether you count both endpoints. Most date libraries return the exclusive difference (2 days in this case).
- Time component — If your dates include a time portion, the difference might not be an exact whole number. Truncate or round as needed.
- Leap years — February has 29 days in leap years. Standard libraries handle this automatically, but manual calculations must account for it.
JavaScript Implementation
JavaScript's Date object stores dates as milliseconds since January 1, 1970 UTC. To find the difference in days:
function daysBetween(startDate, endDate) {
const MS_PER_DAY = 1000 * 60 * 60 * 24;
const start = new Date(startDate);
const end = new Date(endDate);
const utcStart = Date.UTC(start.getFullYear(), start.getMonth(), start.getDate());
const utcEnd = Date.UTC(end.getFullYear(), end.getMonth(), end.getDate());
return Math.floor((utcEnd - utcStart) / MS_PER_DAY);
}
daysBetween('2026-01-01', '2026-12-31');
// 364
daysBetween('2026-03-01', '2026-04-01');
// 31
Using Date.UTC() strips out time zone offsets, ensuring the calculation is based purely on calendar dates. Without it, Daylight Saving Time transitions could produce off-by-one errors.
For a more robust solution with the popular date-fns library:
import { differenceInDays, differenceInCalendarDays } from 'date-fns';
differenceInCalendarDays(new Date('2026-12-31'), new Date('2026-01-01'));
// 364
differenceInDays(new Date('2026-12-31T23:00:00'), new Date('2026-01-01T01:00:00'));
// 364
Python Implementation
Python's datetime module makes date subtraction straightforward:
from datetime import date
start = date(2026, 1, 1)
end = date(2026, 12, 31)
delta = end - start
print(delta.days)
# 364
The subtraction returns a timedelta object whose .days attribute gives the whole-number difference. This handles leap years and varying month lengths automatically.
For parsing date strings:
from datetime import datetime
start = datetime.strptime("2026-03-15", "%Y-%m-%d").date()
end = datetime.strptime("2026-07-20", "%Y-%m-%d").date()
print((end - start).days)
# 127
With dateutil for more flexible parsing:
from dateutil.parser import parse
start = parse("March 15, 2026").date()
end = parse("July 20, 2026").date()
print((end - start).days)
# 127
Excel Formulas
Excel stores dates as serial numbers (the number of days since January 1, 1900), making date arithmetic as simple as subtraction.
Simple subtraction:
=B2-A2
If A2 contains 2026-01-01 and B2 contains 2026-12-31, the result is 364. Format the result cell as a Number (not Date) to see the day count.
DATEDIF function:
=DATEDIF(A2, B2, "D")
The third argument specifies the unit: "D" for days, "M" for complete months, "Y" for complete years.
=DATEDIF("2026-01-01", "2026-04-01", "D") → 90
=DATEDIF("2026-01-01", "2026-04-01", "M") → 3
=DATEDIF("2020-06-15", "2026-06-15", "Y") → 6
DAYS function (Excel 2013+):
=DAYS(B2, A2)
This is equivalent to simple subtraction but more readable and handles text-formatted dates.
How to Add or Subtract Days from a Date
Adding Days
Adding a specific number of days to a date is essential for calculating deadlines, expiration dates, and delivery estimates.
JavaScript:
function addDays(dateStr, days) {
const date = new Date(dateStr);
date.setDate(date.getDate() + days);
return date.toISOString().split('T')[0];
}
addDays('2026-01-15', 30);
// "2026-02-14"
addDays('2026-01-31', 30);
// "2026-03-02"
addDays('2026-02-28', 1);
// "2026-03-01" (2026 is not a leap year)
addDays('2024-02-28', 1);
// "2024-02-29" (2024 is a leap year)
JavaScript's setDate() automatically handles month and year rollovers. Setting the date to 32 on a 31-day month rolls over to the 1st of the next month.
Python:
from datetime import date, timedelta
start = date(2026, 1, 15)
result = start + timedelta(days=30)
print(result)
# 2026-02-14
result = date(2026, 3, 1) + timedelta(days=90)
print(result)
# 2026-05-30
Excel:
=A2+30
Simply add the number of days to a date cell. Excel's serial number system makes this trivial.
Subtracting Days
Subtracting days works identically—just use a negative number.
JavaScript:
function subtractDays(dateStr, days) {
const date = new Date(dateStr);
date.setDate(date.getDate() - days);
return date.toISOString().split('T')[0];
}
subtractDays('2026-03-01', 1);
// "2026-02-28"
subtractDays('2026-01-01', 1);
// "2025-12-31"
Python:
from datetime import date, timedelta
result = date(2026, 3, 1) - timedelta(days=1)
print(result)
# 2026-02-28
result = date(2026, 1, 1) - timedelta(days=365)
print(result)
# 2025-01-01
Excel:
=A2-30
Common Use Cases
| Scenario | Calculation | Example |
|---|---|---|
| Payment due date | Invoice date + net days | Mar 1 + 30 = Mar 31 |
| Subscription renewal | Start date + subscription period | Jan 15 + 365 = Jan 15 next year |
| Contract expiration | Signing date + contract term | Jun 1, 2026 + 730 days = Jun 1, 2028 |
| Delivery estimate | Ship date + transit days | Apr 5 + 7 = Apr 12 |
| Warranty end date | Purchase date + warranty period | Dec 25, 2025 + 365 = Dec 25, 2026 |
| Passport renewal | Expiry date − 180 days | Jan 1, 2028 − 180 = Jul 5, 2027 |
For quick calculations without opening a code editor, the Date Calculator lets you add or subtract any number of days, weeks, months, or years from a given date.
Working Days Calculator: Excluding Weekends and Holidays
What Are Working Days
Working days (also called business days) are weekdays from Monday through Friday, excluding public holidays. This distinction matters in many real-world scenarios:
- Legal deadlines: Courts and regulators often specify deadlines in business days.
- Shipping estimates: Carriers typically only operate on business days.
- Financial settlements: Stock trades settle in T+2 business days.
- Project timelines: Sprint planning uses working days to estimate effort.
The relationship between calendar days and business days varies, but a common approximation is:
| Calendar Days | Approximate Business Days |
|---|---|
| 7 | 5 |
| 14 | 10 |
| 30 | 22 |
| 60 | 44 |
| 90 | 66 |
| 365 | 261 |
JavaScript Implementation
Here's a function to count working days between two dates:
function getWorkingDays(startDate, endDate) {
const start = new Date(startDate);
const end = new Date(endDate);
let count = 0;
const current = new Date(start);
while (current <= end) {
const dayOfWeek = current.getDay();
if (dayOfWeek !== 0 && dayOfWeek !== 6) {
count++;
}
current.setDate(current.getDate() + 1);
}
return count;
}
getWorkingDays('2026-04-01', '2026-04-30');
// 22
getWorkingDays('2026-01-01', '2026-12-31');
// 261
For better performance with large date ranges, avoid iterating day by day. Instead, calculate using complete weeks:
function getWorkingDaysFast(startDate, endDate) {
const start = new Date(startDate);
const end = new Date(endDate);
const MS_PER_DAY = 86400000;
let totalDays = Math.floor((end - start) / MS_PER_DAY) + 1;
let fullWeeks = Math.floor(totalDays / 7);
let remainingDays = totalDays % 7;
let workingDays = fullWeeks * 5;
let startDay = start.getDay();
for (let i = 0; i < remainingDays; i++) {
let day = (startDay + i) % 7;
if (day !== 0 && day !== 6) {
workingDays++;
}
}
return workingDays;
}
getWorkingDaysFast('2026-01-01', '2026-12-31');
// 261
Python:
from datetime import date, timedelta
def working_days_between(start, end):
count = 0
current = start
while current <= end:
if current.weekday() < 5:
count += 1
current += timedelta(days=1)
return count
print(working_days_between(date(2026, 4, 1), date(2026, 4, 30)))
# 22
Python also has the numpy approach for large-scale calculations:
import numpy as np
start = np.datetime64('2026-04-01')
end = np.datetime64('2026-04-30')
print(np.busday_count(start, end))
# 21 (exclusive of end date)
Excel NETWORKDAYS Function
Excel provides a built-in function specifically for working day calculations:
=NETWORKDAYS(start_date, end_date, [holidays])
Examples:
=NETWORKDAYS("2026-04-01", "2026-04-30")
→ 22
=NETWORKDAYS("2026-01-01", "2026-12-31")
→ 261
To exclude holidays, pass a range of holiday dates as the third argument:
=NETWORKDAYS("2026-01-01", "2026-12-31", D2:D12)
Where D2:D12 contains your list of public holiday dates.
NETWORKDAYS.INTL lets you define custom weekends (e.g., Friday-Saturday in some countries):
=NETWORKDAYS.INTL("2026-04-01", "2026-04-30", "0000011")
The weekend string "0000011" marks Saturday and Sunday as non-working days (1 = non-working). For a Friday-Saturday weekend, use "0000110".
Handling Public Holidays
Public holidays vary by country, region, and even industry. A robust working-day calculator must account for these. Here's a JavaScript implementation that accepts a list of holidays:
function getWorkingDaysExcludingHolidays(startDate, endDate, holidays = []) {
const start = new Date(startDate);
const end = new Date(endDate);
const holidaySet = new Set(holidays.map(h => new Date(h).toISOString().split('T')[0]));
let count = 0;
const current = new Date(start);
while (current <= end) {
const dayOfWeek = current.getDay();
const dateStr = current.toISOString().split('T')[0];
if (dayOfWeek !== 0 && dayOfWeek !== 6 && !holidaySet.has(dateStr)) {
count++;
}
current.setDate(current.getDate() + 1);
}
return count;
}
const usHolidays2026 = [
'2026-01-01', // New Year's Day
'2026-01-19', // MLK Day
'2026-02-16', // Presidents' Day
'2026-05-25', // Memorial Day
'2026-07-03', // Independence Day (observed)
'2026-09-07', // Labor Day
'2026-11-26', // Thanksgiving
'2026-12-25', // Christmas
];
getWorkingDaysExcludingHolidays('2026-01-01', '2026-12-31', usHolidays2026);
// 253
Python with holidays library:
import holidays
from datetime import date, timedelta
us_holidays = holidays.US(years=2026)
def working_days_excluding_holidays(start, end, holiday_dict):
count = 0
current = start
while current <= end:
if current.weekday() < 5 and current not in holiday_dict:
count += 1
current += timedelta(days=1)
return count
print(working_days_excluding_holidays(date(2026, 1, 1), date(2026, 12, 31), us_holidays))
Date Math Across Time Zones
UTC vs Local Time
When performing date calculations, time zones can introduce subtle bugs. Consider a server in New York (UTC-5) processing a request from a user in Tokyo (UTC+9). The "current date" differs by up to 14 hours between them.
The golden rule: always perform date arithmetic in UTC, then convert to local time for display.
JavaScript:
const nowUTC = new Date();
console.log(nowUTC.toISOString());
// "2026-04-01T12:00:00.000Z"
console.log(nowUTC.toLocaleDateString('en-US', { timeZone: 'America/New_York' }));
// "4/1/2026"
console.log(nowUTC.toLocaleDateString('en-US', { timeZone: 'Asia/Tokyo' }));
// "4/1/2026" (or "4/2/2026" depending on the time)
Python:
from datetime import datetime, timezone
import zoneinfo
now_utc = datetime.now(timezone.utc)
eastern = now_utc.astimezone(zoneinfo.ZoneInfo("America/New_York"))
tokyo = now_utc.astimezone(zoneinfo.ZoneInfo("Asia/Tokyo"))
print(eastern.date())
print(tokyo.date())
For deeper exploration of time zone handling and epoch time conversion, see our Timestamp Converter.
Common Pitfalls
1. Daylight Saving Time (DST) Transitions
When clocks spring forward, a day might only have 23 hours. When they fall back, a day might have 25 hours. If you calculate date differences using raw milliseconds without normalizing to UTC dates first, you can get incorrect results.
const march13 = new Date('2026-03-07T00:00:00-05:00');
const march15 = new Date('2026-03-09T00:00:00-04:00');
const diffMs = march15 - march13;
const diffDays = diffMs / (1000 * 60 * 60 * 24);
console.log(diffDays);
// 1.9583... (not exactly 2, because of DST)
The fix is to use Date.UTC() or Math.round() when converting milliseconds to days.
2. Date-only vs. DateTime Comparisons
Comparing a date string "2026-04-01" with a DateTime like new Date() can produce unexpected results because the date string is interpreted as midnight UTC while new Date() uses local time.
const dateOnly = new Date('2026-04-01');
console.log(dateOnly.toISOString());
// "2026-04-01T00:00:00.000Z" (UTC midnight)
const localNow = new Date('2026-04-01T10:30:00');
console.log(localNow.toISOString());
// depends on local timezone
3. Off-by-one Errors
"From April 1 to April 3" — is that 2 days or 3 days? It depends on your counting method:
- Exclusive (most common in programming): April 3 − April 1 = 2 days
- Inclusive (common in legal/business contexts): April 1, April 2, April 3 = 3 days
Always clarify which convention applies to your use case.
Date Calculation in Different Scenarios
Project Management
Date calculations are central to planning sprints, releases, and milestones.
Sprint planning:
A typical Scrum sprint is 2 weeks (10 working days). Knowing your sprint start date, you can calculate:
function sprintEndDate(startDate, sprintDays = 10) {
const start = new Date(startDate);
let workingDaysAdded = 0;
while (workingDaysAdded < sprintDays) {
start.setDate(start.getDate() + 1);
const day = start.getDay();
if (day !== 0 && day !== 6) {
workingDaysAdded++;
}
}
return start.toISOString().split('T')[0];
}
sprintEndDate('2026-04-01');
// "2026-04-15"
Milestone tracking:
Calculate the percentage of time elapsed in a project:
from datetime import date
project_start = date(2026, 1, 15)
project_end = date(2026, 6, 30)
today = date(2026, 4, 1)
total_days = (project_end - project_start).days
elapsed_days = (today - project_start).days
progress = (elapsed_days / total_days) * 100
print(f"Project progress: {progress:.1f}%")
# Project progress: 45.6%
Legal
Legal contexts often require precise date calculations with specific rules.
Statute of limitations:
from datetime import date, timedelta
incident_date = date(2024, 6, 15)
limitation_period_years = 2
limitation_period_days = limitation_period_years * 365
expiry_date = incident_date + timedelta(days=limitation_period_days)
today = date(2026, 4, 1)
if today <= expiry_date:
remaining = (expiry_date - today).days
print(f"Statute expires in {remaining} days on {expiry_date}")
else:
print("Statute of limitations has expired")
# Statute expires in 75 days on 2026-06-15
Contract period calculation:
Many contracts specify durations in months rather than days. Be aware that "3 months from January 31" is ambiguous—does it end on April 30 or May 1? Python's dateutil.relativedelta handles this:
from dateutil.relativedelta import relativedelta
from datetime import date
contract_start = date(2026, 1, 31)
contract_end = contract_start + relativedelta(months=3)
print(contract_end)
# 2026-04-30
Personal
Age calculation:
function calculateAge(birthDateStr) {
const birth = new Date(birthDateStr);
const today = new Date();
let age = today.getFullYear() - birth.getFullYear();
const monthDiff = today.getMonth() - birth.getMonth();
if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) {
age--;
}
return age;
}
calculateAge('1990-08-25');
// 35 (as of April 2026)
Countdown to an event:
from datetime import date
event_date = date(2026, 12, 25)
today = date(2026, 4, 1)
remaining = (event_date - today).days
print(f"{remaining} days until Christmas!")
# 268 days until Christmas!
Days alive:
function daysAlive(birthDateStr) {
const birth = new Date(birthDateStr);
const today = new Date();
const MS_PER_DAY = 86400000;
return Math.floor((today - birth) / MS_PER_DAY);
}
daysAlive('1990-08-25');
// ~13,003 days (as of April 2026)
Financial
Simple interest calculation period:
from datetime import date
deposit_date = date(2026, 1, 1)
maturity_date = date(2026, 7, 1)
principal = 10000
annual_rate = 0.05
days = (maturity_date - deposit_date).days
interest = principal * annual_rate * (days / 365)
print(f"Days: {days}")
print(f"Interest: ${interest:.2f}")
# Days: 181
# Interest: $247.95
Payment schedule generation:
function generatePaymentSchedule(startDate, intervalDays, numberOfPayments) {
const schedule = [];
const current = new Date(startDate);
for (let i = 0; i < numberOfPayments; i++) {
schedule.push({
payment: i + 1,
date: current.toISOString().split('T')[0],
});
current.setDate(current.getDate() + intervalDays);
}
return schedule;
}
generatePaymentSchedule('2026-04-01', 30, 6);
// [
// { payment: 1, date: "2026-04-01" },
// { payment: 2, date: "2026-05-01" },
// { payment: 3, date: "2026-05-31" },
// { payment: 4, date: "2026-06-30" },
// { payment: 5, date: "2026-07-30" },
// { payment: 6, date: "2026-08-29" }
// ]
Day-count conventions in finance:
Financial instruments use specific conventions for counting days in interest periods:
| Convention | Description | Used By |
|---|---|---|
| Actual/365 | Actual days divided by 365 | UK government bonds |
| Actual/360 | Actual days divided by 360 | US money markets |
| 30/360 | Assumes 30-day months and 360-day years | US corporate bonds |
| Actual/Actual | Actual days in period / actual days in year | US Treasury bonds |
Frequently Asked Questions
How do you calculate the number of days between two dates?
Subtract the earlier date from the later date. In JavaScript, convert both to timestamps and divide the difference by 86400000 (ms per day). In Excel, simply subtract one cell from another. Online tools like QubitTool's Date Calculator do this instantly.
How do you add days to a date?
Create a date object and add the desired number of days. In JavaScript, use setDate(getDate() + n). In Python, use timedelta(days=n). In Excel, simply add the number to a date cell. This is useful for calculating deadlines and due dates.
How do you calculate working days between two dates?
Count all days between two dates, then exclude weekends (Saturdays and Sundays) and optionally public holidays. In Excel, use the NETWORKDAYS function. In code, iterate through each day and check if it falls on a weekday.
What is the difference between calendar days and business days?
Calendar days include every day (weekdays, weekends, holidays), while business days only count Monday through Friday, excluding public holidays. A 30-calendar-day period typically contains about 22 business days.
How do you handle leap years in date calculations?
Leap years add one day (Feb 29) every 4 years, except for century years not divisible by 400. Most programming languages and date libraries handle leap years automatically. When calculating manually, check if the year is divisible by 4 (and by 400 for century years).
Here's a quick reference for leap year rules:
function isLeapYear(year) {
return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);
}
isLeapYear(2024); // true
isLeapYear(2025); // false
isLeapYear(2000); // true
isLeapYear(1900); // false
import calendar
calendar.isleap(2024) # True
calendar.isleap(2025) # False
calendar.isleap(2000) # True
calendar.isleap(1900) # False
Conclusion
Date calculations are deceptively complex. Between varying month lengths, leap years, time zones, DST transitions, and the distinction between calendar days and business days, there are many places where subtle bugs can creep in. The key takeaways:
- Use established libraries — Don't reinvent date math. Use
date-fnsordayjsin JavaScript,datetimeanddateutilin Python, and built-in functions in Excel. - Normalize to UTC — Always perform arithmetic in UTC to avoid time zone and DST issues.
- Clarify your counting method — Know whether your use case requires inclusive or exclusive counting, calendar days or business days.
- Account for holidays — Working-day calculations are only accurate if you include the relevant holiday calendar for your region.
- Test edge cases — Leap years, month boundaries, year boundaries, and DST transitions are where date bugs hide.
For everyday date calculations—days between dates, adding or subtracting days, or counting working days—skip the manual math and use the Date Calculator. It runs entirely in your browser, handles all edge cases, and gives you instant results. Pair it with the Timestamp Converter when you need to work with Unix timestamps alongside human-readable dates.