Cálculo de intervalo de tempo
Publicado por DAVISON MARCEL PASQUALINI (última atualização em 09/01/2010)
[ Hits: 19.662 ]
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ã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.
#/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 --
Automatizador de instalação de flatpaks
Script para criação de usuarios.
Aplicando layer7 sem digitar uma linha de código sequer
Filtrando trabalhos de impressão...
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Ubunto não reconhece rede ethernet (0)
Secure boot, artigo interessante, nada técnico. (3)
Instalação dualboot Windows 11 e Debian 13 (11)









