Como obter o tempo decorrido de duas datas baseadas em texto

6

Eu gostaria de saber se existe uma maneira de calcular a diferença entre duas vezes no bash. Eu tenho dois campos que são extraídos de um arquivo de log:

Hora de início: 12 de fevereiro 10:02:10 Hora de término: 12 de fevereiro 10:53:15

O que eu preciso é de uma maneira manual de obter o tempo decorrido entre essas duas datas. Como os valores de tempo são "baseados em texto" e não em um comando de geração de data, não sei se há uma maneira de fazer isso. Os horários são baseados em 24 horas, portanto, espero que isso facilite o tempo de meia-noite. Qualquer sugestão será muito apreciada. Peter V.

    
por peterv6 12.02.2011 / 17:03

3 respostas

14

Você poderia usar alguns truques malignos:

date -d "Feb 12 10:02:10" +%s

retornará o número de segundos desde a época para essa data. Combinando isso com o mesmo comando (para a outra data) e executando bc :

echo "'date -d 'Feb 12 10:53:15' +%s' - 'date -d 'Feb 12 10:02:10' +%s'" | bc

Vai te dar

3065

o número de segundos entre os horários. Você provavelmente poderia analisar isso com awk de alguma forma se você precisasse executá-lo mais de uma vez.

    
por 12.02.2011 / 17:30
2

Se você não se importa com um utilitário auxiliar externo, dê uma olhada nos meus dateutils . A tarefa acima se traduz em:

ddiff -i '%b %d %H:%M:%S' 'Feb 12 10:02:10' 'Feb 12 10:53:15'
=> 
  3065s

onde -i é usado para descrever o formato da data de entrada.

    
por 13.04.2012 / 08:25
1

Outra solução sem bc

1. Converta as datas para a hora do Unix (também conhecida como hora POSIX ou hora da Epoch do UNIX)

date1 = date -d "Feb 12 10:02:10" +%s

date2 = date -d "Feb 12 10:53:15" +%s

user@linux:~$ echo -e "$date1\n$date2"
1518447730
1518450795
user@linux:~$ 

2. Calcule a diferença entre duas datas

let datediff="date2-date1"

3. Você terá a resposta em segundos

user@linux:~$ echo $datediff
3065
user@linux:~$

4. Converta-o para o formato de horas, minutos e segundos

user@linux:~$ printf '%02dh:%02dm:%02ds\n' $(($datediff/3600)) $(($datediff%3600/60)) $(($datediff%60))
00h:51m:05s
user@linux:~$ 
    
por 22.06.2018 / 13:36