Cálculo de intervalo de tempo

Publicado por DAVISON MARCEL PASQUALINI (última atualização em 09/01/2010)

[ Hits: 19.291 ]

Download calctime.sh

Download calctime2.sh (versão 2)




Este script calcula em segundos a diferença entre duas datas/horários. Considera mudança de ano, meses, ano bissexto... tudo! E ainda possui um modo interativo onde você o chama passando um parâmetro e ele chama outra rotina passando o resultado e os demais parâmetros que você informar.

Testado em Debian e Open Solaris.

  



Versões atualizadas deste script

Versão 2 - Enviado por DAVISON MARCEL PASQUALINI em 08/01/2010

Changelog: Se o seu sistema operacional possui a opção %s (para saber digite: date +%s), o script pode ser bem mais simples ... segue a versão 2.

Download calctime2.sh


Esconder código-fonte

#/bin/sh
# ROTINA DE VARIACAO DE SEGUNDOS ENTRE DUAS DATAS 
# Codigo pertence a Comunidade 
# VOL (Viva o Linux)
#-------------------------------------------------------
#          Primeira versao:          Davison Pasqualini   
#            30/12/2009                    fdmarp
#-------------------------------------------------------

# OPCOES
#-------------------------

   INTERATIVO="n"             # n - mostra a variacao de data
                              # s - chama um script de passando o resultado em
                              #     $1 e toda a string passada inicialmente para
                              #     o calctime.sh quando este foi chamado.
   SCRIPT_ACT="seu_script.sh" # preencher apenas se for para chamar outro script
                              #
 


# =========================================================

mostra_resultado ()
{
MENSAGEM="$resultado_final $guarda_linha"
if [  "$INTERATIVO" = "s" ]; then
sh $SCRIPT_ACT $MENSAGEM
else
echo "resultado: $resultado_final segundos"
fi
}


data_inicial=$1
data_final=$3
hora_inicial=$2
hora_final=$4
dia1=`echo $data_inicial | cut -d"/" -f1`
mes1=`echo $data_inicial | cut -d"/" -f2`
ano1=`echo $data_inicial | cut -d"/" -f3`
dia2=`echo $data_final | cut -d"/" -f1`
mes2=`echo $data_final | cut -d"/" -f2`
ano2=`echo $data_final | cut -d"/" -f3`
hora1=`echo $hora_inicial | cut -d":" -f1`
min1=`echo $hora_inicial | cut -d":" -f2`
seg1=`echo $hora_inicial | cut -d":" -f3`
hora2=`echo $hora_final | cut -d":" -f1`
min2=`echo $hora_final | cut -d":" -f2`
seg2=`echo $hora_final | cut -d":" -f3`
guarda_linha=`echo $* | cut -d" " -f5-`

verifica_bissexto ()
{
verif1=`echo scale=3\;$ano_val/4 |bc | cut -d. -f2`
if [  "$verif1" -eq 0 ]; then
verifica_bissexto_p2
else 
bissexto="0"
fi
}

verifica_bissexto_p2 ()
{
verif2=`echo scale=3\;$ano_val/100 |bc | cut -d. -f2`
if [  "$verif2" -eq 0 ]; then
verifica_bissexto_p3
else 
bissexto="1"
fi
}

verifica_bissexto_p3 ()
{
verif3=`echo scale=3\;$ano_val/400 |bc | cut -d. -f2`
if [  "$verif3" -eq 0 ]; then
bissexto="1"
else 
bissexto="0"
fi
}

verifica_bissexto_p4 ()
{
ano_val=`expr $ano_fim + 1`
verifica_bissexto
if [ "$bissexto" -eq 0 ]; then
dias_count=`expr $dias_count + 28`
else
dias_count=`expr $dias_count + 29`
fi
}

varia_ano ()
{
dias_count=0
ano_val=$ano1
while [ "$ano_val" -le "$ano_fim" ];
do
verifica_bissexto
if [ "$bissexto" -eq 0 ]; then
dias_count=`expr $dias_count + 365`
else
dias_count=`expr $dias_count + 366`
fi
ano_val=`expr $ano_val + 1`
done
varia_mes
}

varia_mes ()
{
mes_val=1
while [ "$mes_val" -le "$mes_fim" ];
do
case "$mes_val" in
"1" | "3" | "5" | "7" | "8" | "10" | "12" )
dias_count=`expr $dias_count + 31`
;;
"01" | "03" | "05" | "07" | "08" )
dias_count=`expr $dias_count + 31`
;;
"4" | "04" | "6" | "06" | "9" | "09" | "11" )
dias_count=`expr $dias_count + 30`
;;

"2" | "02" )
verifica_bissexto_p4
;;
* )
rotina_erro
;;
esac
mes_val=`expr $mes_val + 1` 
done
varia_dia
}

varia_dia ()
{
varia_hora=0
dias_count=`expr $dia_fim + $dias_count`
varia_dias_data=`expr $dias_count \* 24 \* 60 \* 60`
varia_hora=`echo $hora \* 3600 + $min \* 60 + $seg + $varia_dias_data | bc`
}

principal ()
{
dia_fim=`expr $dia1 - 1`
ano_fim=`expr $ano1 - 1`
mes_fim=`expr $mes1 - 1`
hora=$hora1
min=$min1
seg=$seg1
varia_ano
res_1=$varia_hora
dia_fim=`expr $dia2 - 1`
ano_fim=`expr $ano2 - 1`
mes_fim=`expr $mes2 - 1`
hora=$hora2
min=$min2
seg=$seg2
varia_ano
res_2=$varia_hora
resultado_final=`expr $res_2 - $res_1`
}


rotina_erro ()
{
clear
echo "
-----------------------------------------------------------------------
  calctime.sh
-----------------------------------------------------------------------
 
NOME 
  calctime.sh

DESCRICAO
  Rotina para calculo de intervalo de tempo.

FORMATO
  calctime.sh DD/MM/YYYY HH:MM:SS DD/MM/YYYY HH:MM:SS
              ------------------- -------------------
                    data menor         data maior

ex.: 
  calctime.sh 10/01/2000 11:00:00 15/01/2000 09:00:00



OPCOES
   INTERATIVO="?"       n - mostra a variacao de data
                      s - chama um script de passando o resultado em
                          $1 e toda a string passada inicialmente para
                           o calctime.sh quando este foi chamado.
   SCRIPT_ACT="????"    nome do script a ser acionado no modo interativo.


                              Viva o Linux
--------------------------------------------------------------Fim-----"
}

if [ "$4" = "" ]; then
rotina_erro
else
principal
mostra_resultado
fi

#-------------------------------------- FIM --

Scripts recomendados

SMELT

Substituir strings em arquivos ascII

Postfix - Listar usuários com over quota

Simples inventário de máquinas em Shell Script

NFS server/client com iptables


  

Comentários
[1] Comentário enviado por fdmarp em 08/01/2010 - 16:57h

Se você possui a opção %s do date, pode usar uma versão simplificada:

#/bin/sh
# ROTINA DE VARIACAO DE SEGUNDOS ENTRE DUAS DATAS
# Codigo pertence a Comunidade
# VOL (Viva o Linux)
#-------------------------------------------------------
# Primeira versao: Davison Pasqualini
# 04/01/2010 fdmarp
#-------------------------------------------------------

data_inicial=`echo $1 | awk -F/ '{ print $2"/"$1"/"$3 }'`
data_final=`echo $3 | awk -F/ '{ print $2"/"$1"/"$3 }'`
hora_inicial=$2
hora_final=$4
data_seg1=`date +%s --date="$data_inicial $hora_inicial"`
data_seg2=`date +%s --date="$data_final $hora_final"`
resultado=`expr $data_seg2 - $data_seg1`
echo $resultado

[2] Comentário enviado por quig0n em 29/04/2011 - 11:03h

Muito bom script!
Salvou minha vida (e poupou algumas horas de trabalho)!
Parabens!!!

[3] Comentário enviado por quig0n em 29/04/2011 - 11:04h

Fiz uma alteração no script aqui para retornar em Dias,Horas,Minutos e Segundos.
Seguem as modificações:

RETRDIAS="s" # retorna o valor no formato DD,HH,MM,SS


# =========================================================

mostra_resultado ()
{
MENSAGEM="$resultado_final $guarda_linha"
if [ "$INTERATIVO" = "s" ]; then
sh $SCRIPT_ACT $MENSAGEM
else
if [ "$RETRDIAS" = "s" ];then
XDIAS=`echo "$resultado_final/86400"|bc`
XHORAS=`echo "$resultado_final/3600%24"|bc`
X=`echo "$XDIAS*24+$XHORAS"|bc`
let X=X*60
let Y=$resultado_final/60
let XMIN=Y-X
let XSEG=$resultado_final%60
echo "${XDIAS}d,${XHORAS}h,${XMIN}m,${XSEG}s"
else
echo "resultado: $resultado_final segundos"
fi
fi
}


Abcs!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts