Diferença entre datas

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

[ Hits: 17.581 ]

Download varia_data.txt

Download varia_data2.sh (versão 2)




O script a seguir calcula a diferença entre datas desde 1970. O uso é simples, basta chamar o script passando primeiro a data menor e depois a maior. Ex.:

$ sh varia_data 12/02/2000 15/04/2015
resultado: 5541 dias

É grande mas é rápido, não se assuste.


  



Versões atualizadas deste script

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

Changelog: Uma alteração bem simples, mas que acaba com o limite de tempo e que também torna o script muito mais rápido.

Download varia_data2.sh


Esconder código-fonte

# ROTINA DE VARIACAO DE DATA 
# Codigo pertence a Comunidade 
# VOL (Viva o Linux)
#-------------------------------------------------------
#          Primeira versao:          Davison Pasqualini   
#            29/12/2009                    fdmarp
#-------------------------------------------------------

#-Parametros-----------------------------------

data_inicial=$1
data_final=$2



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`


#-Calculo--------------------------------------
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=1970
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
;;
esac
mes_val=`expr $mes_val + 1` 
done
varia_dia
}

varia_dia ()
{
dias_count=`expr $dia_fim + $dias_count`
}

dia_fim=`expr $dia1 - 1`
ano_fim=`expr $ano1 - 1`
mes_fim=`expr $mes1 - 1`
varia_ano
Varia_dias_data1=$dias_count


dia_fim=`expr $dia2 - 1`
ano_fim=`expr $ano2 - 1`
mes_fim=`expr $mes2 - 1`
varia_ano
Varia_dias_data2=$dias_count

resultado=`expr $Varia_dias_data2 - $Varia_dias_data1`

echo "resultado: $resultado dias"

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


Scripts recomendados

rc.firewall

Script que envia email para um Relay sem autenticação.

Script para fazer funcionar o bloqueio por horário - Squid

Otimiza.sh - Atualiza seu Ubuntu/Debian

Mudar senha de usuário automaticamente


  

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

Se o seu SO possui no date a opção +%s a versão simplificada atende muito bem.

#/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 fdmarp em 11/01/2010 - 18:51h

Fica melhor se substituir

ano_val=1970

por

ano_val=$ano1


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts