2017-01-22 69 views
7

我有一个文件,其中包含一组格式为H:M:S.MS的时间戳,我可以读取和打印所有保存的时间戳,但是当我进行一些像减法(如Timestamp2 - Timestamp1)的算术运算时, t给我答案,我没有经验与bash脚本编程工作。在bash脚本中减去两个时间戳

任何意见,建议将不胜感激。我的问题是screen shot

下面是一个例子:

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

End Time - Start Time预期的结果是要么0:00:0.2030660.203066

+0

您的时间戳是如何获得的?也许我们在这里遇到一个XY问题:你是否想要一个过程? –

+1

请为样本输入添加样本输入和您想要的输出到您的问题。 – Cyrus

+0

您有权访问GNU日期吗? – Cyrus

回答

7

如果你想用简单的命令行工具来处理日期,您需要将时间戳转换成一些易于处理,与制作,如为基础的时代。

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

然后你就可以直接相减:

你可以用date命令,你可以在一个功能包,像这样做

echo $(($(timestamp "${Stime[$i]}") - $(timestamp "${Rtime[$i]}"))) 

注意,因为你不记录当天的情况,但只有当时,例如,当开始时间是23:59:59而结束时间是00:00:01时,您将会有错误。

0

假设您的变量是整数,您需要将您的计算包含在算术评估中以使其正常工作。

echo $((VAR1 - VAR2)) 

或者,如果你要分配的值:

VAR3=$((VAR1 - VAR2)) 
+0

(())上下文中的变量不需要$符号。 – Inian

+0

谢谢弗雷德... – Ali

+0

谢谢伊恩... – Ali

0

如果需要使用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)) 
+0

这只适用于小数点后有3位数字。 –

+0

非常感谢glenn jackman – Ali