如何在获得 2 次之间的差异时将秒转换为 hh:mm:ss.ms

如何在获得 2 次之间的差异时将秒转换为 hh:mm:ss.ms

我执行了一个计算,使用 perl 命令将当前时间戳转换为毫秒,如下所示:

perl -MTime::HiRes=time -MPOSIX=strftime -e '
$now = int(time() * 1000);
printf "%s.%03d\n", strftime("%H:%M:%S", localtime(int($now/1000))), ($now % 1000);'

从上面我想将输出转换为秒,我可以使用下面的示例来实现:

echo "21:48:40.596" | awk -F: '{ if (NF == 1) {print $NF} else if (NF == 2) {print $1 * 60 + $2} else if (NF==3) {OFMT = "%2.3f"; print $1 * 3600 + $2 * 60 + $3 } }'

使用上面的命令,如果我比较以秒为单位的读数,我可以使用下面的命令来获取两个值之间的差异(以秒为单位)并保持毫秒数:

例子:

DIFF_SEC=$(echo "78522.896 - 78520.596" | bc -l | awk '{printf("%.3f\n", $1)}')

输出:

echo $DIFF_SEC
2.300

我想从上面知道如何计算上面命令之间的差异 hh:mm:ss.milseconds

我已经设法弄清楚以下内容,但是没有显示毫秒:

DIFF=`printf '%02dh:%02dm:%02ds.%03d\n' $((DIFF_SEC/3600)) $((DIFF_SEC%3600/60)) $((DIFF_SEC%60))`

输出:

echo "$DIFF"
00h:00m:02s.000

我所期待的如下:

00h:00m:02s.300

答案1

use Time::HiRes ('gettimeofday','tv_interval')

my @t1 = Time::HiRes::gettimeofday();
# do a bunch of stuff
my $t2 = Time::HiRes::tv_interval(\@t1,[Time::HiRes::gettimeofday()]);
say $t2;

0.040614

这是一个例子,从“现在”开始,然后区分第一个“现在”和第二个“现在”。我想这就是你要问的,除非我读错了。

您正在向 tv_interval 传递第一个时间数组的数组引用和第二个当前时间数组的数组引用。

您基本上没有完全使用 Time::HiRes,它本身已经完成了所有这些工作,因此无需使用其他任何东西。这对于日志记录等非常有用。

如果您在 AIX 上使用 perl 遇到困难,您可以使用以下命令,这并不理想,但它确实有效:

t1=`perl -MTime::HiRes=time  -e 'print time'`
sleep 1
t2=`perl -MTime::HiRes=time  -e 'print time'`
DIFF_SEC=`echo $t2-$t1|bc -l | awk '{printf("%.3f\n", $1)}'`
echo "$DIFF_SEC\n"
MS=`echo "$DIFF_SEC"| awk -F'.' '{print $2}'`
DIFF=`printf '%02d:%02d:%02d\n' $((DIFF_SEC/3600)) $((DIFF_SEC%3600/60)) $((DIFF_SEC%60))`
DIFF2=`printf '%02d hrs %02d mins %02d\n' $((DIFF_SEC/3600)) $((DIFF_SEC%3600/60)) $((DIFF_SEC%60))`
echo "$DIFF" | awk '{print $1"'".$MS"'"}'
echo "$DIFF2" | awk '{print $1,$2,$3,$4,$5 "'".$MS"' Secs"}'

输出:

1.017

00:00:01.017
00 hrs 00 mins 01.017 Secs

答案2

只是快速提醒我们可以使用该命令date重新格式化日期和时间

$ DIFF_sec=91.034    ## calculate diff in your favorite way
$ date -d "0+$DIFF_sec seconds"  '+%H:%M:%S.%3N'
00:01:31.034

date还可以计算差异

$ T1=95.1
$ T2=195.2
$ date -d "0 + $T2 seconds - $T1 seconds"  '+%H:%M:%S.%3N'
00:01:40.100

最后,可以通过日期计算T1和T2:

$ start=`date '+%s.%3N'`
$ end=`date '+%s.%3N'`
$ date -d " 0 + $end seconds - $start seconds"  '+%H:%M:%S.%3N'
00:00:05.706

答案3

使用 Time::Format 代替 Time::HiRes:

perl -MTime::Format -e 'print $time{"hh:mm:ss.mmm"}'

如果Time::HiRes您的整个过程都在perl.您需要测量纳秒级时间的任务非常有限。

但由于您使用的是命令行执行,我假设您想要测量某些工具的某些执行 - 仅在执行过程中您就会失去纳秒,如果毫秒就足够了,则不需要纳秒 - Time::Format 是足够的。

如果您需要测量时间差,您可以执行以下操作:

#/bin/bash 
t1=`perl -MTime::HiRes=time  -e 'print time'`
sleep 1
t2=`perl -MTime::HiRes=time  -e 'print time'`
diff=`echo $t2-$t1|bc`
echo $t1, $t2, $diff
perl -MTime::Format -e "print time_format 'mm:ss.mmm', $diff"

相关内容