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

编写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"

脚本说明

  1. 时间戳转换:用字符串截取${ts:0:4}这类语法,把YYYYMMDDHHMMSS拆分成YYYY-MM-DD HH:MM:SS的标准格式,让date命令能识别并转换成Unix时间戳(从1970年到目标时间的总秒数)。我把转换逻辑封装成了函数,让代码更整洁易维护。
  2. 差值计算:用三元表达式取绝对值,这样不管d1和d2的先后顺序,结果都是正数,避免出现负的时间差。
  3. 格式拆解:
    • 1天=86400秒,总秒数除以86400得到天数
    • 剩余秒数除以3600得到小时数
    • 再剩余的除以60得到分钟数
    • 最后剩下的就是秒数
  4. 格式化输出:用%02d确保秒数是两位数字(比如4秒会显示成04sec),完全匹配你要求的输出格式。

测试示例

如果把d2改成20180115121511,脚本会输出:

4days 21hrs 56min 04sec

完美契合你给出的示例格式~

内容的提问来源于stack exchange,提问作者Tushar Kanta Bisoi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:20:18