Skip to main content

How to Add Days to Date

• 3 min read
bash

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

MethodSyntaxBest ForNotes
date -d (GNU)date -d "date + N days"Linux systemsMost flexible, handles any unit
dateadd (macOS)date -v+NdmacOS onlyNative macOS syntax
Manual calculationUnix timestamps mathCross-platformMore complex but portable
Python/PerlExternal scriptComplex logicOverkill 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 -d option 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.