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

如何用Shell命令计算ISO格式时间戳差值并提取时分秒?

解决Shell处理ISO时间戳的两个问题

一、提取时分秒部分

你遇到的date命令报错是因为部分版本的date(比如BSD date或旧版GNU date)无法直接解析YYYY-MM-DDTHH:MM:SS+00:00格式。直接用字符串操作提取更可靠,以下是几种方法:

方法1:用cut命令分段截取

EndTime="1970-01-01T01:08:26+00:00"
# 先按T分割取第二部分,再按+分割取第一部分
curr=$(echo "$EndTime" | cut -d'T' -f2 | cut -d'+' -f1)
echo "$curr"  # 输出:01:08:26

方法2:Bash参数展开(内置操作,更高效)

EndTime="1970-01-01T01:08:26+00:00"
# 移除T及之前的所有字符
temp=${EndTime#*T}
# 移除+及之后的所有字符
curr=${temp%+*}
echo "$curr"  # 输出:01:08:26

方法3:用sed正则替换

EndTime="1970-01-01T01:08:26+00:00"
curr=$(echo "$EndTime" | sed 's/.*T\(.*\)+.*/\1/')
echo "$curr"  # 输出:01:08:26

二、计算两个ISO时间戳的差值

如果只提取时分秒计算差值,会忽略跨天的情况,正确做法是先将时间转换为epoch时间戳(自1970-01-01 00:00:00 UTC以来的秒数),再计算差值:

适用于GNU date(Linux系统)

start_time="2021-07-28T19:18:02+00:00"
end_time="2021-07-28T20:20:05+00:00"

# 转换为epoch秒数
start_epoch=$(date -d "$start_time" +%s)
end_epoch=$(date -d "$end_time" +%s)

# 计算秒数差值
diff_seconds=$((end_epoch - start_epoch))

# 转换为时分秒格式
hours=$((diff_seconds / 3600))
minutes=$(( (diff_seconds % 3600) / 60 ))
seconds=$((diff_seconds % 60))

echo "时间差值:${hours}小时${minutes}分钟${seconds}秒"

适用于BSD date(macOS系统)

start_time="2021-07-28T19:18:02+00:00"
end_time="2021-07-28T20:20:05+00:00"

# 转换为epoch秒数
start_epoch=$(date -j -f "%Y-%m-%dT%H:%M:%S%z" "$start_time" +%s)
end_epoch=$(date -j -f "%Y-%m-%dT%H:%M:%S%z" "$end_time" +%s)

# 计算秒数差值
diff_seconds=$((end_epoch - start_epoch))

# 转换为时分秒格式
hours=$((diff_seconds / 3600))
minutes=$(( (diff_seconds % 3600) / 60 ))
seconds=$((diff_seconds % 60))

echo "时间差值:${hours}小时${minutes}分钟${seconds}秒"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:54:36