我有一个文件,其中包含一组格式为H:M:S.MS
的时间戳,我可以读取并打印所有已保存的时间戳,但是当我进行像Subtract这样的算术运算时(比如Timestamp2 - Timestamp1
)它没有给我答案,我没有使用bash脚本编程的经验。
任何建议,建议都将不胜感激。
以下是我问题的screen shot。
以下是一个例子:
Start Time = 17:53:01.166721
End Time = 17:53:01.369787
End Time - Start Time
的预期结果为0:00:0.203066
或0.203066
。
答案 0 :(得分:11)
如果您想使用简单的命令行工具处理日期,则需要将时间戳转换为易于处理的格式,例如基于纪元的格式。
您可以使用date
命令执行此操作,您可以将其包含在如下函数中:
timestamp() {
date '+%s%N' --date="$1"
}
# timestamp "12:20:45.12345" ==> 1485105645123450000
然后你可以直接减去它们:
echo $(( $(timestamp "${Stime[$i]}") - $(timestamp "${Rtime[$i]}") ))
请注意,由于您没有跟踪当天但仅记录时间,因此您将遇到错误,例如,开始时间是23:59:59,结束时间是00:00:01。 / p>
答案 1 :(得分:3)
假设您的变量是整数,您需要将计算括在算术评估中,以便工作。
echo $(( VAR1 - VAR2 ))
或者,如果要分配值:
VAR3=$(( VAR1 - VAR2 ))
答案 2 :(得分:2)
如果需要使用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
然后你可以减去得到代表差异的毫秒数。
使用算术和字符串构造转换为秒:
$ seconds="$((milliseconds / 1000)).$((milliseconds % 1000))"
$ echo $seconds
45296.789
解决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
# .......^^^
另外,像“08”和“09”这样的无效八进制数的字符串会在bash算术中抛出错误,所以明确声明它们是基数10
milliseconds=$(( (10#$h*3600 + 10#$m*60 + 10#$s)*1000 + 10#$ms ))