Como encontrar diferença entre dois timestamps de até milésimos de segundo?

9

Eu sou novo em scripts de shell. O coração do meu script é encontrar a diferença entre dois timestamps até milissegundos. Comigo eu tenho um arquivo com conteúdo de timestamps somente como

2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
2012-09-13 15:00:29,428 2012-09-13 15:00:29,447

Assim, tenho cerca de 30 mil registros, onde não devo enfrentar nenhum problema de desempenho quando executo o script. Muitos fatores como ano bissexto, meses com 31 dias etc. aparecem quando estou tentando escrever um script para isso.

Alguém pode me ajudar nisso, por favor?

    
por Vamshi G 20.11.2012 / 07:13

3 respostas

12

Não é necessário analisar de forma complexa, fará toda a mágica para você, com a ajuda de seu amigo, :

#!/bin/bash
while read d1_1 d1_2 d2_1 d2_2; do
  secdiff=$((
    $(date -d "$d2_1 $d2_2" +%s) - $(date -d "$d1_1 $d1_2" +%s)
  ))
  nanosecdiff=$((
    $(date -d "$d2_1 $d2_2" +%N) - $(date -d "$d1_1 $d1_2" +%N)
  ))
  printf "%s %s - %s %s = %d milliseconds\n" $d2_1 $d2_2 $d1_1 $d1_2 $((
    (secdiff * 1000) + (nanosecdiff / 1000000)
  ))
done < YOUR_FILE.txt

OUTPUT

2012-09-13 15:00:29,297 - 2012-09-13 15:00:29,290 = 7 milliseconds
2012-09-13 15:00:29,447 - 2012-09-13 15:00:29,428 = 19 milliseconds

Veja man date

OBSERVAÇÃO

  • date -d é muito útil, converte timestamps
  • %s é o tempo época (segundos desde 01-01-1970)
  • %N é nanossegundos
  • $(( )) e (( )) são para bash aritmética, consulte link
  • $( ) significa command substitution

Isso também atende às suas necessidades?

    
por 20.11.2012 / 07:38
0

Uma linguagem de script como Perl, Python ou Ruby será rápida e exigirá pouco esforço. Por exemplo, com Perl e Date :: Parse :

perl -MDate::Parse -l -ne 's/,/./g; split; print str2time("$_[2] $_[3]") - str2time("$_[0] $_[1]")'

(Para cada linha, substitua , por . , divida a linha em palavras $_[0] a $_[3] , analise as datas formadas pelas duas primeiras e as próximas duas palavras e imprima a diferença.) / p>     

por 21.11.2012 / 01:53
0

Acabei de encontrar este post, existe - pelo menos hoje - uma solução mais simples baseada em date . Usando o framework na resposta de @Gilles Quenot (teria escrito um comentário para sua anwser, mas sem reputação suficiente):

while read d1_1 d1_2 d2_1 d2_2
do
    date -d "$d2_1 $d2_2 $(date -d "$d1_1 $d1_2" +%s.%N) seconds ago" +%s.%N
done << END
2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
END

O resultado:

$ ./time_elapsed.sh 
0.007000000

Usar %3N em vez de %N truncará a saída em milissegundos.

    
por 24.09.2017 / 18:12