Calculando durações em Unix

Qual é a duração de um processo que começa às 10:00:05 e termina às 10:01:24?

Quanto tempo passou entre 2013-08-06 23:17:34 e 2013-08-07 06:20:03?

Podemos descobrir a resposta a essas perguntas e muito mais, convertendo as strings de data / hora de início e término em carimbos de data / hora Unix usando date(segundos desde a época). Então, subtrair o carimbo de data / hora de início do final (usando expr) nos dá a duração em segundos.

Aqui está um script de shell simples que demonstra a técnica:

timestamp(){
date
-j -f "%F %T" $* +%s
}
starttime
=$(timestamp $1)
endtime
=$(timestamp $2)
duration
=$(expr $endtime - $starttime)
echo
"Duration (seconds): $duration"

Alimentar nossos exemplos com o script é assim:

./duration.sh 2013-08-0623:17:34 2013-08-0706:20:03
Duration (seconds): 25349
./duration.sh 2013-08-0610:00:05 2013-08-0610:01:24
Duration (seconds): 79

Barra lateral: observe que comprimimos a data e a hora juntas 2013-08-0610:10:24,, ao chamar o script. Isso ocorre porque o bash separa os argumentos da linha de comando por espaços. Nossa timestampfunção não se importa, porém, porque dateremove os espaços em branco da máscara e da entrada antes da transformação.