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

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

Re: [shell-script] date


From: Tiago Barcellos Peczenyj
Subject: Re: [shell-script] date
Date: Mon, 12 Jun 2006 10:27:11 -0300

vamos por membros esvicerados:

Vc tem uma data no formato: DD/MM/YYYY HH:MI:SS
Vc quer saber:
a) se esta data é um fim de semana e
b) se está dentro (ou fora) do intervalo 6:30-18:30

optei por usar awk que é o que eu mais conheço. a primeira coisa que
eu precisa saber era se a data era um fim de semana. pesquisando
descobri a função

strftime("formato", data-hora)

esta função retorna a data-hora em um formato que eu defino. descobri
que, se usar %a, eu tenho o dia da semana com tres caracteres. Ora,
pra saber se é sabado ou domingo agora é uma barbada!

entretanto esta data-hora não é no formato que vc informa. eu preciso
criar uma usando o mktime() e os seus parametros. vc informa
DD/MM/YYYY HH:MI:SS e o mktime requer
YYYY/MM/DD HH:MI:SS, então criou-se uma polêmica.

se eu informar ao awk que o separador de campo é espaço, ':' e '/'
(pus um tab também, vai que tenha em algum lugar) e ler a sua string,
eu consigo converter fazendo

date=$3" "$2" "$1" "$4" "$5" "$6

Agora vem o pulo do gato!

weekday=strftime("%a",mktime(date))
if(weekday == "Sun" || weekday == "Sat"){
  # a data informada eh um fim de semana!
}

Agora vem a parte "dificil". como saber se a hora esta dentro (ou
fora) do intervalo que vc deseja. Uma forma ao meu ver simples é
converter a hora em segundos desde a meia noite. assim se eu quero
saber se a hora x:y:z esta entre 6:30:00 e 18:30:00 eu faço

sec_day = x * 60 * 60 + y * 60 + z
sec_up   = 6 * 60 * 60 + 30 * 60 + 0
sec_down = 18 * 60 * 60 + 30 * 60 + 0

fariamos um teste assim:
if((sec_day <  sec_up)||(sec_day > sec_down)){
# se o numero de segundos for menor que a hora mais 'cedo' (chamei de
sec_up por
#alguma loucura da minha cabeça) OU for maior que a hora mais 'tarde'
(idem, sec_down)
#a hora informada esta fora do periodo
} else {
 # esta dentrio do periodo
}

como as contas de 'hora' sao repetitivas, criei uma função que converte.

Espero que atenda às suas necessidades.

Em 12/06/06, rafael.nery<address@hidden> escreveu:
Tiago Barcellos Peczenyj,
Agora fiquei confuso no que vc fez...
Ficou muito complexo.
#!/bin/bash
# le uma data no formato DD/MM/YYYY HH:MI:SS
# caso o dia seja um fim de semana : sab/dom
# e esteja fora da faixa 6:30:00 a 18:30:00
# imprime algo

echo "$@" | awk -F"[ \t:/]" '
function seconds(h,m,s){ # retorna o numero de segundos dessa hora !
        return 60*(60*h + m)+s;
}

{
        date=$3" "$2" "$1" "$4" "$5" "$6
        weekday=strftime("%a",mktime(date))

        sec_day  = seconds($4,$5,$6)
        sec_down = seconds(18,30,00)
        sec_up   = seconds( 6,30,00)

        if(weekday == "Sun" || weekday == "Sat"){
                #print "final de semana"
                if((sec_day <  sec_up)||(sec_day > sec_down)){
                        # acho que eh isso que vc quer, senao eh so
alterar o if!
                        print "fora do horario"
                }
        }
}'


Em 09/06/06, rafael.nery<address@hidden> escreveu:
> Pessoal,
> A variavel DATE, uma data no formato:
> DD/MM/YYYY HH:MI:SS.
> Como posso fazer um script para verificar se ela está entre 18:30 e 6:30 e se 
o dia não é final de semana.
>  Estou tentando algo do tipo:
> #!/bin/bash
> horaAtual="date"
> hora1="18:30"
> hora2="06:30"
> data="date +%a"
> if  [ "$horaAtual" -ge "$hora1"  -a   "$horaAtual" -le "$hora2" -a
> then
> echo "nao"
> exit1
> #else "sim"
> fi
>
> Mas nào está funcionando e falta tb o dia.
> Alguém me ajuda?
> Obrigado,
> Rafael.
>
>
>



---------------------------------------------------------------------
Esta lista não admite a abordagem de outras liguagens de programação, como 
perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio 
aviso.
---------------------------------------------------------------------
Sair da lista: address@hidden
---------------------------------------------------------------------
Esta lista é moderada de acordo com o previsto em 
http://www.listas-discussao.cjb.net
---------------------------------------------------------------------
Servidor Newsgroup da lista: news.gmane.org
Grupo: gmane.org.user-groups.programming.shell.brazil


Links do Yahoo! Grupos










--
Tiago B Peczenyj
Linux User #405772

# cd /pub
# more beer


reply via email to

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