Ubuntu下Shell脚本扩展:实现两日期的年/月/日/时/秒差值计算
扩展Ubuntu Shell脚本实现多维度日期差值计算
我有一段Ubuntu下的Shell脚本,原本用来计算两个yyyy/mm/dd格式日期的天数差值,但现在需要扩展它,使其能输出两个日期之间的天数、月数、年数、小时数、秒数,输出样式如下:
' ' Days ' ' Months ' ' Years ' ' Hours ' ' Seconds
原脚本代码(存在语法小问题,减法运算符缺失):
echo echo "Enter Date 1 ..(Use date format: yyyy/mm/dd)....." read d1 echo "Enter Date 2 ..... (Use date format: yyyy/mm/dd)....." read d2 echo res=$((($(date -d $d2 + %s) $(date -d $d1 + %s)) / 86400)) echo $res days
修改后的完整脚本
#!/bin/bash # 提示用户输入日期 echo "请输入日期1(格式:yyyy/mm/dd):" read d1 echo "请输入日期2(格式:yyyy/mm/dd):" read d2 # 验证日期格式,避免无效输入导致脚本报错 if ! date -d "$d1" >/dev/null 2>&1 || ! date -d "$d2" >/dev/null 2>&1; then echo "错误:输入的日期格式无效,请使用yyyy/mm/dd格式!" exit 1 fi # 计算两个日期的时间戳差值,单位:秒 timestamp_diff=$(( $(date -d "$d2" +%s) - $(date -d "$d1" +%s) )) # 处理负数差值,如果日期2早于日期1,取绝对值保证结果为正 if [ $timestamp_diff -lt 0 ]; then timestamp_diff=$(( -timestamp_diff )) fi # 计算各维度差值 seconds=$timestamp_diff hours=$(( seconds / 3600 )) days=$(( hours / 24 )) # 月数按平均每月30.4375天计算,即365.25/12 months=$(echo "scale=2; $days / 30.4375" | bc) # 年数按平均每年365.25天计算 years=$(echo "scale=2; $days / 365.25" | bc) # 按要求格式输出 echo "$days Days" echo "$months Months" echo "$years Years" echo "$hours Hours" echo "$seconds Seconds"
关键修改说明
- 修复语法错误:补充原脚本中时间戳计算缺失的减法运算符
-,确保差值计算正常 - 增加格式验证:通过
date命令校验输入日期的有效性,避免无效输入导致脚本崩溃 - 多维度差值计算:基于时间戳差值推导所有维度结果,其中月数/年数采用天文平均天数计算,保留两位小数
- 兼容逆序日期:自动处理日期2早于日期1的情况,取差值绝对值保证结果为正
内容的提问来源于stack exchange,提问作者CodeHunter
相关产品推荐
相关产品推荐

