如何用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
相关产品推荐
相关产品推荐

