How to Add Days to Date
Quick Answer: Add Days to a Date in Bash
Use date -d "YYYY-MM-DD + N days" +%Y-%m-%d to add days to any date. The -d option interprets date strings and performs arithmetic, while +%Y-%m-%d formats the output. For today: date -d "today + 7 days" +%Y-%m-%d.
Quick Comparison: Date Arithmetic Methods
| Method | Syntax | Best For | Notes |
|---|---|---|---|
| date -d (GNU) | date -d "date + N days" | Linux systems | Most flexible, handles any unit |
| dateadd (macOS) | date -v+Nd | macOS only | Native macOS syntax |
| Manual calculation | Unix timestamps math | Cross-platform | More complex but portable |
| Python/Perl | External script | Complex logic | Overkill for simple addition |
Bottom line: Use date -d on Linux for simplicity, or learn date arithmetic with timestamps for portability across systems.
Adding Days to Dates
Date arithmetic is common in automation scripts. You might need to calculate due dates, expiration dates, or report timeframes. Bash’s date command makes this straightforward with the -d (or --date) option.
Method 1: Basic Date Arithmetic with date -d
Add days to today’s date:
# Add 7 days to today
date -d "today + 7 days" +%Y-%m-%d
# Add 30 days to today
date -d "+30 days" +%Y-%m-%d
# Subtract 5 days
date -d "today - 5 days" +%Y-%m-%d
Output:
2026-02-28
2026-03-23
2026-02-16
When to Use Basic Date Arithmetic
- You need to calculate dates relative to today
- You’re scripting backup retention policies
- You need quick date calculations in one-liners
- You’re working on Linux systems (GNU date)
Method 2: Adding Days to a Specific Date
You can perform arithmetic on any date, not just today:
#!/bin/bash
START_DATE="2026-02-21"
# Add 7 days to a specific date
END_DATE=$(date -d "$START_DATE + 7 days" +%Y-%m-%d)
echo "End date: $END_DATE"
# Output: 2026-02-28
# Add 1 month
NEXT_MONTH=$(date -d "$START_DATE + 1 month" +%Y-%m-%d)
echo "Next month: $NEXT_MONTH"
# Output: 2026-03-21
# Add 1 year
NEXT_YEAR=$(date -d "$START_DATE + 1 year" +%Y-%m-%d)
echo "Next year: $NEXT_YEAR"
# Output: 2027-02-21
When to Use Specific Date Arithmetic
- You’re working with dates from user input or files
- You need to calculate expiration dates
- You’re generating project timelines
- You need to add weeks, months, or years (not just days)
Method 3: Calculating Date Differences
Calculate the number of days between two dates:
#!/bin/bash
START="2026-02-21"
END="2026-02-28"
# Convert dates to Unix timestamps
START_EPOCH=$(date -d "$START" +%s)
END_EPOCH=$(date -d "$END" +%s)
# Calculate difference in seconds and convert to days
DAYS_DIFF=$(( (END_EPOCH - START_EPOCH) / 86400 ))
echo "Days between dates: $DAYS_DIFF"
# Output: Days between dates: 7
When to Use Date Differences
- You need to check how many days remain until expiration
- You’re calculating elapsed time between events
- You’re validating license expiration dates
- You want to measure project duration
Practical Examples
Real-World Example: Backup Retention
Here’s a practical script that deletes backups older than 30 days:
#!/bin/bash
BACKUP_DIR="/backups"
RETENTION_DAYS=30
# Calculate cutoff date (30 days ago)
CUTOFF_DATE=$(date -d "$RETENTION_DAYS days ago" +%Y-%m-%d)
echo "Removing backups older than: $CUTOFF_DATE"
# Find and delete old backups
for backup in "$BACKUP_DIR"/backup_*.tar.gz; do
if [ -f "$backup" ]; then
# Extract date from filename (assuming format: backup_YYYY-MM-DD.tar.gz)
file_date=$(basename "$backup" | sed 's/backup_\([^.]*\).*/\1/')
# Compare dates
if [ "$file_date" \< "$CUTOFF_DATE" ]; then
echo "Deleting: $(basename "$backup")"
rm "$backup"
fi
fi
done
Business Days Calculation
For business logic, you might need to add only weekdays:
#!/bin/bash
add_business_days() {
local start_date="$1"
local days_to_add="$2"
local current_date="$start_date"
local business_days=0
while (( business_days < days_to_add )); do
# Move to next day
current_date=$(date -d "$current_date + 1 day" +%Y-%m-%d)
# Check if it's a weekday (1-5 = Monday-Friday)
day_of_week=$(date -d "$current_date" +%u)
if (( day_of_week <= 5 )); then
((business_days++))
fi
done
echo "$current_date"
}
# Usage: Add 5 business days to 2026-02-21
result=$(add_business_days "2026-02-21" 5)
echo "5 business days later: $result"
Checking Expiration Dates
Check if something is expired:
#!/bin/bash
# Certificate expires on this date
EXPIRY_DATE="2026-03-15"
# Check how many days until expiration
TODAY=$(date +%Y-%m-%d)
TODAY_EPOCH=$(date -d "$TODAY" +%s)
EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s)
DAYS_LEFT=$(( (EXPIRY_EPOCH - TODAY_EPOCH) / 86400 ))
if (( DAYS_LEFT < 0 )); then
echo "EXPIRED: Certificate expired $((DAYS_LEFT * -1)) days ago"
elif (( DAYS_LEFT < 7 )); then
echo "WARNING: Certificate expires in $DAYS_LEFT days"
elif (( DAYS_LEFT < 30 )); then
echo "NOTICE: Certificate expires in $DAYS_LEFT days"
else
echo "OK: Certificate expires in $DAYS_LEFT days"
fi
Formatting Output
Add days and display in different formats:
#!/bin/bash
BASE_DATE="2026-02-21"
DAYS_TO_ADD=14
NEW_DATE=$(date -d "$BASE_DATE + $DAYS_TO_ADD days" +%Y-%m-%d)
# Display in various formats
echo "ISO format: $NEW_DATE"
echo "Long format: $(date -d "$NEW_DATE" '+%A, %B %d, %Y')"
# Output: Saturday, March 07, 2026
echo "Unix timestamp: $(date -d "$NEW_DATE" +%s)"
# Output: 1741305600
echo "Week of year: $(date -d "$NEW_DATE" +%V)"
# Output: 10
Handling Different Date Formats
The date command is flexible with input formats:
#!/bin/bash
# Add 10 days to various date formats
echo "From standard format:"
date -d "2026-02-21 + 10 days" +%Y-%m-%d
echo "From month name:"
date -d "Feb 21, 2026 + 10 days" +%Y-%m-%d
echo "From relative date:"
date -d "last Friday + 10 days" +%Y-%m-%d
Project Timeline
#!/bin/bash
PROJECT_START="2026-02-21"
# Calculate key milestones
PLANNING_END=$(date -d "$PROJECT_START + 7 days" +%Y-%m-%d)
DEVELOPMENT_END=$(date -d "$PROJECT_START + 30 days" +%Y-%m-%d)
QA_END=$(date -d "$PROJECT_START + 40 days" +%Y-%m-%d)
LAUNCH=$(date -d "$PROJECT_START + 45 days" +%Y-%m-%d)
echo "Project Timeline"
echo "================"
echo "Start: $PROJECT_START"
echo "Planning ends: $PLANNING_END"
echo "Dev ends: $DEVELOPMENT_END"
echo "QA ends: $QA_END"
echo "Launch: $LAUNCH"
Important Notes
- Use
+for forward dates,-for backward dates - You can add days, weeks, months, or years
- The
-doption is available in GNU date (Linux) but may not work on macOS - Always use quotes around date strings if they contain spaces
- Timestamps are in seconds since epoch (Unix time)
Quick Reference
# Add days
date -d "today + 7 days" +%Y-%m-%d
# Add weeks
date -d "today + 2 weeks" +%Y-%m-%d
# Add months
date -d "today + 3 months" +%Y-%m-%d
# Add years
date -d "today + 1 year" +%Y-%m-%d
# Subtract
date -d "today - 5 days" +%Y-%m-%d
# To a specific date
date -d "2026-02-21 + 10 days" +%Y-%m-%d
Summary
Date arithmetic is essential for scheduling, expiration tracking, and time-based automation. The date -d syntax makes it easy to add days to dates and calculate durations. Master these patterns and you’ll be able to implement date-based logic reliably in your scripts.