Skip to main content

How to Calculate Date Difference

2 min read
bash date time difference calculation epoch date math

Quick Answer: Calculate Date Difference in Bash

To find the difference in days between two dates, convert to epoch: date1=$(date -d "2026-02-21" +%s); date2=$(date -d "2026-03-15" +%s); echo $((($date2 - $date1) / 86400)). This converts to Unix timestamps, subtracts, and divides by seconds per day.

Quick Comparison: Date Difference Calculation

UnitFormulaBest ForPrecision
Days(ts2 - ts1) / 86400Date rangesDay-level
Hours(ts2 - ts1) / 3600Short durationsHour-level
Minutes(ts2 - ts1) / 60Quick checksMinute-level
Secondsts2 - ts1Precise timingSecond-level

Bottom line: Convert to epoch timestamps, subtract, divide by unit size (86400 for days).


Calculate the difference between two dates in various units. Learn finding days, hours, minutes, and formatted differences.

Method 1: Calculate Days Difference

# Convert dates to epoch and calculate difference
date1="2026-02-21"
date2="2026-03-15"

epoch1=$(date -d "$date1" +%s)
epoch2=$(date -d "$date2" +%s)

diff_seconds=$((epoch2 - epoch1))
diff_days=$((diff_seconds / 86400))

echo "Days between: $diff_days"

# Output: Days between: 22

Function for Date Difference

#!/bin/bash

date_diff_days() {
  local date1="$1"
  local date2="$2"

  epoch1=$(date -d "$date1" +%s)
  epoch2=$(date -d "$date2" +%s)

  diff_seconds=$((epoch2 - epoch1))
  diff_days=$((diff_seconds / 86400))

  echo "$diff_days"
}

# Usage
days=$(date_diff_days "2026-02-21" "2026-03-15")
echo "Difference: $days days"

Calculate Hours Difference

#!/bin/bash

date_diff_hours() {
  local date1="$1"
  local date2="$2"

  epoch1=$(date -d "$date1" +%s)
  epoch2=$(date -d "$date2" +%s)

  diff_seconds=$((epoch2 - epoch1))
  diff_hours=$((diff_seconds / 3600))

  echo "$diff_hours"
}

# Usage
hours=$(date_diff_hours "2026-02-21 10:00" "2026-02-21 15:30")
echo "Difference: $hours hours"

Calculate Hours and Minutes

#!/bin/bash

date_diff_detailed() {
  local date1="$1"
  local date2="$2"

  epoch1=$(date -d "$date1" +%s)
  epoch2=$(date -d "$date2" +%s)

  diff_seconds=$((epoch2 - epoch1))

  hours=$((diff_seconds / 3600))
  minutes=$(((diff_seconds % 3600) / 60))
  seconds=$((diff_seconds % 60))

  echo "$hours hours, $minutes minutes, $seconds seconds"
}

# Usage
result=$(date_diff_detailed "2026-02-21 10:00:00" "2026-02-21 14:45:30")
echo "Difference: $result"

# Output: Difference: 4 hours, 45 minutes, 30 seconds

Calculate Complete Time Difference

#!/bin/bash

date_diff_complete() {
  local date1="$1"
  local date2="$2"

  epoch1=$(date -d "$date1" +%s)
  epoch2=$(date -d "$date2" +%s)

  diff_seconds=$((epoch2 - epoch1))

  # Handle negative difference
  if [ "$diff_seconds" -lt 0 ]; then
    echo "Date2 is earlier than Date1"
    return 1
  fi

  days=$((diff_seconds / 86400))
  hours=$(((diff_seconds % 86400) / 3600))
  minutes=$(((diff_seconds % 3600) / 60))
  seconds=$((diff_seconds % 60))

  if [ "$days" -gt 0 ]; then
    echo "$days days, $hours hours, $minutes minutes, $seconds seconds"
  elif [ "$hours" -gt 0 ]; then
    echo "$hours hours, $minutes minutes, $seconds seconds"
  elif [ "$minutes" -gt 0 ]; then
    echo "$minutes minutes, $seconds seconds"
  else
    echo "$seconds seconds"
  fi
}

# Usage
result=$(date_diff_complete "2026-02-21 10:00:00" "2026-02-23 14:45:30")
echo "Difference: $result"

# Output: Difference: 2 days, 4 hours, 45 minutes, 30 seconds

Practical Example: Project Deadline Countdown

#!/bin/bash

# File: deadline_countdown.sh

deadline="2026-03-31"

current_epoch=$(date +%s)
deadline_epoch=$(date -d "$deadline" +%s)

diff_seconds=$((deadline_epoch - current_epoch))

if [ "$diff_seconds" -le 0 ]; then
  echo "Deadline has passed!"
  exit 1
fi

days=$((diff_seconds / 86400))
hours=$(((diff_seconds % 86400) / 3600))
minutes=$(((diff_seconds % 3600) / 60))

echo "=== Deadline Countdown ==="
echo "Deadline: $deadline"
echo ""
echo "Time remaining:"
printf "  %d days, %d hours, %d minutes\n" "$days" "$hours" "$minutes"

# Progress warning
if [ "$days" -lt 7 ]; then
  echo ""
  echo "⚠️  URGENT: Less than one week remaining!"
fi

Output:

=== Deadline Countdown ===
Deadline: 2026-03-31

Time remaining:
  38 days, 7 hours, 23 minutes

Practical Example: Age Calculator

#!/bin/bash

# File: calculate_age.sh

birthdate="$1"

if [ -z "$birthdate" ]; then
  echo "Usage: $0 <birthdate> (format: YYYY-MM-DD)"
  exit 1
fi

today=$(date +%Y-%m-%d)

epoch_birth=$(date -d "$birthdate" +%s)
epoch_today=$(date -d "$today" +%s)

diff_seconds=$((epoch_today - epoch_birth))
age_days=$((diff_seconds / 86400))
age_years=$((age_days / 365))
remaining_days=$((age_days % 365))

echo "Birthdate: $birthdate"
echo "Age: $age_years years and $remaining_days days"
echo "Total days: $age_days"

Usage:

$ ./calculate_age.sh 1990-05-15
Birthdate: 1990-05-15
Age: 35 years and 281 days
Total days: 12956

Practical Example: File Age Check

#!/bin/bash

# File: check_file_age.sh

file="$1"
max_days="${2:-30}"

if [ ! -f "$file" ]; then
  echo "ERROR: File not found"
  exit 1
fi

# Get file modification time
mod_time=$(stat -c %Y "$file" 2>/dev/null || stat -f %m "$file" 2>/dev/null)
current_time=$(date +%s)

age_seconds=$((current_time - mod_time))
age_days=$((age_seconds / 86400))

echo "File: $file"
echo "Age: $age_days days"
echo "Max allowed: $max_days days"
echo ""

if [ "$age_days" -gt "$max_days" ]; then
  echo "⚠️  WARNING: File is older than $max_days days!"
  exit 1
else
  echo "✓ File is current"
fi

Usage:

$ ./check_file_age.sh /var/log/app.log 7

Compare Two Files by Date

#!/bin/bash

# Find which file is newer

file1="$1"
file2="$2"

if [ ! -f "$file1" ] || [ ! -f "$file2" ]; then
  echo "Usage: $0 <file1> <file2>"
  exit 1
fi

time1=$(stat -c %Y "$file1" 2>/dev/null || stat -f %m "$file1" 2>/dev/null)
time2=$(stat -c %Y "$file2" 2>/dev/null || stat -f %m "$file2" 2>/dev/null)

diff_seconds=$((time2 - time1))
diff_days=$((diff_seconds / 86400))

if [ "$diff_seconds" -gt 0 ]; then
  echo "$file2 is newer by $diff_days days"
elif [ "$diff_seconds" -lt 0 ]; then
  echo "$file1 is newer by $((diff_days * -1)) days"
else
  echo "Files have same modification time"
fi

Date Difference from Now

#!/bin/bash

# Calculate days since an event

event_date="$1"

if [ -z "$event_date" ]; then
  echo "Usage: $0 <date> (format: YYYY-MM-DD)"
  exit 1
fi

epoch_event=$(date -d "$event_date" +%s)
epoch_now=$(date +%s)

diff_seconds=$((epoch_now - epoch_event))
diff_days=$((diff_seconds / 86400))

if [ "$diff_days" -eq 1 ]; then
  echo "1 day ago"
elif [ "$diff_days" -gt 1 ]; then
  echo "$diff_days days ago"
else
  echo "Less than a day ago"
fi

Common Mistakes

  1. Incorrect epoch calculation - use date -d "YYYY-MM-DD" +%s
  2. Integer division issues - use / for division, % for modulo
  3. Timezone differences - epoch is in UTC
  4. Leap second handling - rare but can affect calculations
  5. Not handling negative differences - check if date1 > date2

Performance Tips

  • Cache epoch calculations in variables
  • Use epoch arithmetic for all calculations
  • Avoid repeated date conversions
  • Test with various date formats

Key Points

  • Convert dates to epoch (seconds since 1970)
  • Use integer division (/) to get whole units
  • Use modulo (%) to get remainder
  • Subtract epoch values to get difference
  • Handle negative differences for ordering

Summary

Calculating date differences is essential for scheduling and monitoring. Convert to epoch seconds first, then use arithmetic for all calculations. Always validate input dates and handle edge cases like negative differences.