【问题标题】:Comparing Two Timestamps Within a Second在一秒钟内比较两个时间戳
【发布时间】:2014-01-03 16:20:39
【问题描述】:

我正在编写一个解析 CSV 文件并执行一些计算的 shell 脚本。

时间戳的格式为:HH:MM:SSS.sss,并存储在变量中:$t2$t1

我想知道这两个戳记之间的区别(总是小于一秒)并以秒为单位将其报告为$t3(即:0.020

t3=$t2-$t1

但是上面的代码只是打印了两个变量之间有一个减号 - 我如何比较两个时间戳?

【问题讨论】:

    标签: shell unix timestamp


    【解决方案1】:

    这是一个时髦的方法!剥离所有整秒以获得毫秒。做减法。如果结果变为负数,那是因为秒数溢出,所以在 1000 毫秒内加回来。在前面插入一个小数点,以毫秒为单位。

    #!/bin/bash -xv
    t1="00:00:02.001"
    t2="00:00:03.081"
    ms1=${t1/*\./}
    ms2=${t2/*\./}
    t3=$((10#$ms2-10#$ms1))
    [[ $t3 < 0 ]] && t3=$((t3+1000))
    t3=$(echo "scale=3; $t3/1000"|bc)
    echo $t3
    

    【讨论】:

    • 几乎成功了,我出现以下错误:./parser.sh: 081: value too great for base (error token is "081") - 有什么想法吗?
    • 尝试使用“bash -xv ./parser.sh”运行脚本来开启调试。
    • 请复制脚本并重试,我似乎在第 3 行和第 4 行的翻译中丢失了一个斜线。
    • 好的,它将“061”和“081”中的前导零解释为八进制。我在以“t3=”开头的每一行的前面放了一个“10#”,所以它知道这些数字是十进制的。再次尝试复制,对不起,我第一次错了!
    • 我不得不再编辑一次 - 抱歉!浮点除法需要在倒数第二行的“bc”中进行,否则八进制问题后小数点可能在错误的位置。我要回去睡觉了——我今天过得很糟糕!
    【解决方案2】:

    在将两个时间戳转换为它们的毫秒值后,您可以使用 awk 数学计算两个时间戳的差异:

    t1=04:13:32.234
    t2=04:13:32.258
    awk -F '[ :.]+' '{
         t1=($1*60*60 + $2*60 + $3)*1000 + $4
         t2=($5*60*60 + $6*60 + $7)*1000 + $8
         print (t2-t1)/60}' <<< "$t1 $t2"
    0.4
    

    用于转换的公式:

    timestamp value (ms) = (hour * 60 * 60 + minute * 60 + second ) * 1000 + milli-second
    

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 1970-01-01
      • 2015-01-02
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2019-02-27
      • 2017-07-10
      相关资源
      最近更新 更多