在bash脚本中减去两个时间戳

在bash脚本中减去两个时间戳,bash,shell,date,math,timestamp,Bash,Shell,Date,Math,Timestamp,我有一个文件,其中包含一组时间戳,格式为H:M:S.MS,我可以读取和打印所有保存的时间戳,但当我执行一些算术运算,如减法(比如timestam2-timestam1)时,它并没有给我答案,我没有使用bash脚本编程的经验 如有任何建议,我们将不胜感激 这是我问题的症结所在 以下是一个例子: Start Time = 17:53:01.166721 End Time = 17:53:01.369787 结束时间-开始时间的预期结果是0:00:0.203066或0.203066假设变量是整数,则

我有一个文件,其中包含一组时间戳,格式为
H:M:S.MS
,我可以读取和打印所有保存的时间戳,但当我执行一些算术运算,如减法(比如
timestam2-timestam1
)时,它并没有给我答案,我没有使用bash脚本编程的经验

如有任何建议,我们将不胜感激

这是我问题的症结所在

以下是一个例子:

Start Time = 17:53:01.166721
End Time = 17:53:01.369787

结束时间-开始时间的预期结果是
0:00:0.203066
0.203066

假设变量是整数,则需要将计算包含在算术计算中才能起作用

echo $(( VAR1 - VAR2 ))
或者,如果要指定值:

VAR3=$(( VAR1 - VAR2 ))

如果需要使用bash,则需要将时间戳转换为整数值:

$ time="12:34:56.789"
$ IFS=":." read -r h m s ms <<<"$time"
$ echo $h $m $s $ms
12 34 56 789
$ milliseconds=$(( (h*3600 + m*60 + s)*1000 + ms ))
$ echo $milliseconds
45296789

要解决gniourf_gniourf的有效观点(以笨拙的方式):


如果希望使用简单的命令行工具处理日期,则需要将时间戳转换为一些易于处理的格式,如基于历元的格式

您可以使用
date
命令执行此操作,您可以将此命令封装在如下函数中:

timestamp() { 
    date '+%s%N' --date="$1"
}
# timestamp '2020-01-01 12:20:45.12345' => 1577899245123450000
然后你可以直接减去它们:

echo $(( $(timestamp "$etime") - $(timestamp "$stime") ))

请注意,
%N
格式说明符(纳秒)是GNU扩展,不在默认的macOS
date
命令中处理。(a)
brew安装coreutils
并在上述函数中使用
gdate
,或(b)在macOS上使用此替代函数(但请注意,它不支持亚秒测量):

timestamp(){
本地格式=“%Y-%m-%d%H:%m:%S”#设置为使用的任何格式
日期-j-f“$format”“$1”“+%s”
}
#时间戳'2020-01-01 12:20:45'=>1577899245

您的时间戳是如何获得的?可能我们在这里遇到了XY问题:您是否正在尝试对进程计时?请将示例输入和该示例输入的所需输出添加到您的问题中。您是否可以访问GNU日期?我们实际上正在记录两台主机之间icmp数据包的时间(发送和接收时间)。获得的时间是我的本地机器时间。geniourf_gniourf这不说明你是如何获得时间戳的。请显示您正在使用的代码(相关部分)。这仅在小数点后有3位数字时有效。这行不是
毫秒=$((h*3600+m*60+s)*1000+ms))
需要
“$”
h m s ms
值上吗?否,如=>“在表达式中,shell变量也可以通过名称引用,而不使用参数扩展语法。”这很微妙,感谢分享,对我帮助很大。在(())上下文中,变量不需要$symbol。这甚至适用于包含日期的输入格式,例如
2020-01-10 19:00:22968
timestamp() { 
    date '+%s%N' --date="$1"
}
# timestamp '2020-01-01 12:20:45.12345' => 1577899245123450000
echo $(( $(timestamp "$etime") - $(timestamp "$stime") ))