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
| Unit | Formula | Best For | Precision |
|---|---|---|---|
| Days | (ts2 - ts1) / 86400 | Date ranges | Day-level |
| Hours | (ts2 - ts1) / 3600 | Short durations | Hour-level |
| Minutes | (ts2 - ts1) / 60 | Quick checks | Minute-level |
| Seconds | ts2 - ts1 | Precise timing | Second-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
- Incorrect epoch calculation - use
date -d "YYYY-MM-DD" +%s - Integer division issues - use
/for division,%for modulo - Timezone differences - epoch is in UTC
- Leap second handling - rare but can affect calculations
- 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.