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 } }'

上記のコマンドを使用して読み取り値を秒単位で比較すると、次のコマンドを使用して秒単位で2つの値の差を取得し、ミリ秒を維持できます。

例:

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

以下は、「今」で始まり、最初の「今」と2番目の「今」を区別する例です。私が間違って読んでいない限り、それはあなたが求めているものだと思います。

最初の時間配列の配列参照と2番目の現在の時間配列の配列参照を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

おすすめ記事