shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Trabalhando com datas


From: Julio Cezar Neves - DISB.O
Subject: Trabalhando com datas
Date: Wed, 8 Nov 2000 10:54:32 -0300

Olas gerais,
se eu já coloquei estas rotinas no grupo me desculpem, mas como eu acho que
não, e penso serem bastante útil para os programas que trabalha com datas,
seja para calcular qtos dias tem entre 2 datas, ou para somar ou subtrair
dias de uma data.

O 1o. programa - dton.sh - converte data (mm/dd/aaaa) para o número de dias
decorridos de 01/01/1980 até esta data. O 2o. - ntod.sh - faz o oposto, isto
é, soma um número recebido com 01/01/1980, transformando o resultado em
data.

Solicito a colaboração dos colegas quanto a apuração dos resultados bem como
críticas e sugestões. Em ambos levei em consideração anos bissextos, o que
dificultou um pouco a lógica e os testes de depuração.

Abraços a todos e bom proveito,
Julio

=======================================================================

PROMPT> cat dton.sh
#!/bin/ksh
#
#======================================================================
# Calcula qtd dias entre uma data passada como parametro e 01/01/1980.
# Se nao for passado nenhum parametro a data de hoje sera assumida.
# Obs. Para executar este programa sob o sh, trocar os $((..)) por expr
#======================================================================
# Leia: Linux - Programacao Shell  ISBN: 85-7452-048-9
# Autor: Julio Cezar Neves <mailto:address@hidden>
#======================================================================
#
if  [ $1 ]
then
        DFim=`echo $1 | cut -f1 -d"/"`
        MFim=`echo $1 | cut -f2 -d"/"`
        AFim=`echo $1 | cut -f3 -d"/"`
else
        DFim=`date +%d`
        MFim=`date +%m`
        AFim=`date +%Y`
fi

TotDias=$((1 + 365 * (AFim - 1980) + (AFim - 1980) / 4))
[ $((AFim % 4)) = 0 -a $MFim -le 2 ] && TotDias=$((TotDias - 1))

for i in `echo "31 28 31 30 31 30 31 31 30 31 30 31" | cut -f-$((MFim - 1))
-d" " 2> /dev/null`
do
        TotDias=$((TotDias + $i))
done
echo $((TotDias + DFim))

=======================================================================

PROMT> cat ntod.sh
#!/bin/ksh
#
#==========================================================
# Recebe uma qtd de dias como parametro, e o transforma em
# uma data, que significa 1/1/1980 + parametro recebido.
# Obs. Para executar este programa sob o sh, trocar por
# $((..)) por expr
#==========================================================
# Leia: Linux - Programacao Shell  ISBN: 85-7452-048-9
# Autor: Julio Cezar Neves <mailto:address@hidden>
#==========================================================
#
Num=$(($1 - 1))
AFim=$((1980 + (Num / 365)))
DFim=$((Num % 365 - Num / 1460))
MFim=1
for i in 31 28 31 30 31 30 31 31 30 31 30 31
do
        [ $DFim -lt $i ] && break
        DFim=$((DFim - i))
        MFim=$((MFim + 1))
done
[ $DFim -eq 0 ] &&
        {
        DFim=29
        MFim=2
        }
[ $DFim -le 9 ] && echo "0$DFim/\c" || echo "$DFim/\c"
[ $MFim -le 9 ] && echo "0$MFim/\c" || echo "$MFim/\c"
echo $AFim

=======================================================================

Olha estes testes de uso

# que dia eh hoje?
PROMPT> date "+%d/%m/%Y"
08/11/2000
# Recebendo na var Num a qtd de dias existentes entre 01/01/1980 e hoje
PROMPT> Num=`dton.sh`
PROMPT> echo $Num
7618
# Daqui a 30 dias serah:
PROMPT> ntod.sh `expr $Num + 30`
08/12/2000
# A trinta dias atras era:
PROMPT> ntod.sh $((Num -30))
09/10/2000

# Vou tirar 20 dias de ferias apos o carnaval. Quando terminarao?
PROMPT> Num=`dton.sh 28/02/2001`
PROMPT> ntod.sh $((Num + 20))
20/03/2001
# Ou entao:
PROMPT> ntod.sh $((`dton.sh 28/02/2001` + 20))
20/03/2001


reply via email to

[Prev in Thread] Current Thread [Next in Thread]