You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"

关键修改说明

  1. 修复语法错误:补充原脚本中时间戳计算缺失的减法运算符-,确保差值计算正常
  2. 增加格式验证:通过date命令校验输入日期的有效性,避免无效输入导致脚本崩溃
  3. 多维度差值计算:基于时间戳差值推导所有维度结果,其中月数/年数采用天文平均天数计算,保留两位小数
  4. 兼容逆序日期:自动处理日期2早于日期1的情况,取差值绝对值保证结果为正

内容的提问来源于stack exchange,提问作者CodeHunter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:25:15