Eu realizei um cálculo que converte o timestamp atual dando milissegundos também usando o comando perl como abaixo:
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);'
Do exposto, desejo converter a saída em segundos, que posso obter usando abaixo, por exemplo:
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 } }'
Com os comandos acima se eu comparar leituras em segundos separados, posso usar o comando abaixo para obter a diferença entre os 2 valores em segundos mantendo os miliconds:
EXEMPLO:
DIFF_SEC=$(echo "78522.896 - 78520.596" | bc -l | awk '{printf("%.3f\n", $1)}')
SAÍDA:
echo $DIFF_SEC
2.300
Gostaria de saber do exposto como posso calcular a diferença entre o comando acima em hh:mm:ss.milseconds
Eu consegui descobrir o seguinte, no entanto, os milissegundos não estão aparecendo:
DIFF=`printf '%02dh:%02dm:%02ds.%03d\n' $((DIFF_SEC/3600)) $((DIFF_SEC%3600/60)) $((DIFF_SEC%60))`
SAÍDA:
echo "$DIFF"
00h:00m:02s.000
O que eu espero está abaixo:
00h:00m:02s.300
0,040614
Esse é um exemplo, comece com 'agora', depois faça a diferença entre o primeiro 'agora' e o segundo 'agora'. Acho que é isso que você está perguntando, a menos que eu esteja lendo errado.
Você está passando tv_interval uma referência de array do primeiro array de tempo e uma referência de array do segundo array de tempo agora.
Você basicamente não usou o Time::HiRes totalmente, ele já faz tudo isso nativamente, então não havia necessidade de usar mais nada. Isso é muito útil para logar etc.
Se você tem dificuldade em usar perl no AIX, pode usar o seguinte, o que não é o ideal, mas funciona:
SAÍDA:
Apenas um lembrete rápido de que podemos usar o comando
date
para reformatar datas e horasdate
também pode calcular diferentesFinalmente, T1 e T2 podem ser calculados por data:
Em vez de Time::HiRes, use Time::Format:
Isso
Time::HiRes
faria sentido se todo o seu processo estivesse dentro do arquivoperl
. Há um conjunto muito limitado de tarefas em que você precisa medir o tempo em nanossegundos.Mas como você está usando a execução de linha de comando, presumo que queira medir alguma execução de algumas ferramentas - você perderia nanossegundos apenas no processo de execução e, se milissegundos forem suficientes, você não precisará de nanossegundos - o Time::Format é suficiente.
E se você precisar medir uma diferença de tempo, pode fazer algo como: