编写Shell脚本计算YYYYMMDDHHMMSS格式时间戳的差值
计算两个YYYYMMDDHHMMSS时间戳的差值并格式化输出
我来帮你写一个满足需求的Shell脚本,思路很清晰:先把自定义格式的时间戳转成Unix时间戳(秒数),计算差值后再转换成天、小时、分钟、秒的格式输出。
完整脚本
#!/bin/bash # 定义输入的两个时间戳 d1="20180110141907" d2="20180110141907" # 将YYYYMMDDHHMMSS格式转换为date命令可识别的YYYY-MM-DD HH:MM:SS,再转成Unix时间戳(秒) convert_to_timestamp() { local ts="$1" date -d "${ts:0:4}-${ts:4:2}-${ts:6:2} ${ts:8:2}:${ts:10:2}:${ts:12:2}" +%s } timestamp1=$(convert_to_timestamp "$d1") timestamp2=$(convert_to_timestamp "$d2") # 计算时间差的绝对值(避免d1小于d2时出现负数) diff_seconds=$(( timestamp1 > timestamp2 ? timestamp1 - timestamp2 : timestamp2 - timestamp1 )) # 将总秒数分解为天、小时、分钟、秒 days=$(( diff_seconds / 86400 )) remaining=$(( diff_seconds % 86400 )) hours=$(( remaining / 3600 )) remaining=$(( remaining % 3600 )) minutes=$(( remaining / 60 )) seconds=$(( remaining % 60 )) # 按照指定格式输出结果,秒数补零确保两位数字 printf "%ddays %dhrs %dmin %02dsec\n" "$days" "$hours" "$minutes" "$seconds"
脚本说明
- 时间戳转换:用字符串截取
${ts:0:4}这类语法,把YYYYMMDDHHMMSS拆分成YYYY-MM-DD HH:MM:SS的标准格式,让date命令能识别并转换成Unix时间戳(从1970年到目标时间的总秒数)。我把转换逻辑封装成了函数,让代码更整洁易维护。 - 差值计算:用三元表达式取绝对值,这样不管d1和d2的先后顺序,结果都是正数,避免出现负的时间差。
- 格式拆解:
- 1天=86400秒,总秒数除以86400得到天数
- 剩余秒数除以3600得到小时数
- 再剩余的除以60得到分钟数
- 最后剩下的就是秒数
- 格式化输出:用
%02d确保秒数是两位数字(比如4秒会显示成04sec),完全匹配你要求的输出格式。
测试示例
如果把d2改成20180115121511,脚本会输出:
4days 21hrs 56min 04sec
完美契合你给出的示例格式~
内容的提问来源于stack exchange,提问作者Tushar Kanta Bisoi
相关产品推荐
相关产品推荐

