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::HiRes 대신 Time::Format을 사용하십시오.

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

전체 Time::HiRes프로세스가 perl.nanosecond 시간을 측정해야 하는 작업이 매우 제한되어 있습니다.

그러나 명령줄 실행을 사용하고 있기 때문에 일부 도구의 특정 실행을 측정하고 싶다고 가정합니다. 실행 중에 나노초가 손실되고 밀리초가 충분하면 나노초가 필요하지 않습니다. 시간::형식이면 충분합니다.

시차를 측정해야 하는 경우 다음을 수행할 수 있습니다.

#/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"

관련 정보