Cálculo de intervalo de tempo

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

[ Hits: 19.431 ]

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

Limpar o cache da memória RAM apenas quando necessário

Sincronizar arquivos com rsync

Executando comandos remotos usando sshpass

Verificar conexão com Internet

Restaurar backup de uma conta cpanel mesmo que ela já exista


  

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