UNIX Shell中计算两个时间戳的小时差值
计算UNIX Shell中两个时间戳的小时差值
嗨,作为UNIX新手遇到这种时间计算问题太正常了!你手里的RunStartDate和RunEndDate是字符串格式的时间戳,直接用算术运算符相减肯定会报错——Shell没法直接对字符串做减法,得先把它们转换成可计算的数值格式:也就是UNIX时间戳(从1970年1月1日00:00:00 UTC以来的总秒数),再进行计算。
下面是具体的解决步骤:
1. 将时间字符串转换为UNIX秒数
用GNU date命令的-d参数解析时间字符串,+%s参数输出对应的秒数。把结果存到变量里方便后续计算:
# 先定义你的时间变量(可以直接用你已有的变量) RunStartDate="Thu May 3 14:12:54 CDT 2018" RunEndDate="Thu May 3 18:11:46 CDT 2018" # 转换为秒数 start_seconds=$(date -d "$RunStartDate" +%s) end_seconds=$(date -d "$RunEndDate" +%s)
注:如果你的系统是BSD系(比如macOS),默认的
date不支持-d参数,需要先安装GNU date(比如通过brew install coreutils),然后用gdate替代上面的date命令。
2. 计算小时差值
得到秒数后,就可以做减法了。1小时等于3600秒,所以把差值除以3600即可:
- 整数小时差值(直接舍去小数部分):
hour_diff_integer=$(( (end_seconds - start_seconds) / 3600 )) echo "整数小时差值:$hour_diff_integer"
- 带小数的精确小时差值(保留两位小数):
用bc工具来做浮点运算:
hour_diff_decimal=$(echo "scale=2; ($end_seconds - $start_seconds)/3600" | bc) echo "精确小时差值:$hour_diff_decimal"
完整示例脚本
把上面的步骤整合起来,直接运行就能得到结果:
#!/bin/bash RunStartDate="Thu May 3 14:12:54 CDT 2018" RunEndDate="Thu May 3 18:11:46 CDT 2018" # 转换为秒数 start_seconds=$(date -d "$RunStartDate" +%s) end_seconds=$(date -d "$RunEndDate" +%s) # 计算两种格式的小时差 hour_diff_integer=$(( (end_seconds - start_seconds) / 3600 )) hour_diff_decimal=$(echo "scale=2; ($end_seconds - $start_seconds)/3600" | bc) echo "===== 时间差值计算结果 =====" echo "整数小时:$hour_diff_integer" echo "精确小时:$hour_diff_decimal"
运行这个脚本,你会得到:
===== 时间差值计算结果 ===== 整数小时:3 精确小时:3.98
(因为18:11:46减去14:12:54是3小时58分52秒,换算成小时就是约3.98小时)
内容的提问来源于stack exchange,提问作者Manoj Srivastava
相关产品推荐
相关产品推荐

