我执行了一个计算,使用 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"