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

Ali*_*Ali 10 math bash shell timestamp date

我有一个文件,其中包含一组时间戳的格式H:M:S.MS,我可以读取并打印所有保存的时间戳,但是当我做一些像Subtract这样的算术运算时(说Timestamp2 - Timestamp1)它没有给我答案,我没有经验使用bash脚本编程.

任何建议,建议将不胜感激.

这是我的问题的屏幕截图.

这是一个例子:

Start Time = 17:53:01.166721
End Time = 17:53:01.369787
Run Code Online (Sandbox Code Playgroud)

预期结果End Time - Start Time0:00:0.2030660.203066.

Gri*_*vit 12

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

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

timestamp() { 
   date '+%s%N' --date="$1"
}
# timestamp "12:20:45.12345"  ==>  1485105645123450000
Run Code Online (Sandbox Code Playgroud)

然后你可以直接减去它们:

echo $(( $(timestamp "${Stime[$i]}") - $(timestamp "${Rtime[$i]}") ))
Run Code Online (Sandbox Code Playgroud)

请注意,由于您没有跟踪当天但仅记录时间,因此您将遇到错误,例如,开始时间是23:59:59,结束时间是00:00:01.


gle*_*man 5

如果需要使用 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
Run Code Online (Sandbox Code Playgroud)

然后您可以减去以获得表示差异的毫秒数。

使用一些算术和字符串构造转换为秒:

$ seconds="$((milliseconds / 1000)).$((milliseconds % 1000))"
$ echo $seconds
45296.789
Run Code Online (Sandbox Code Playgroud)

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

$ time="12:34:56.7"
$ IFS=":." read -r h m s ms <<<"$time"
$ ms="${ms}000"; ms=${ms:0:3}
$ echo $h $m $s $ms
12 34 56 700
# .......^^^
Run Code Online (Sandbox Code Playgroud)

此外,像 "08" 和 "09" 这样的无效八进制数的字符串会在 bash 算术中抛出错误,因此明确声明它们是基数为 10

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 仅当小数点后有 3 位数字时,此方法才有效。 (2认同)