Como listar todos os finais de semana pelos próximos 6 meses?

1
$ SAT=$(date -dsaturday +%Y-%m-%d)
$ SUN=$(date -dsunday +%Y-%m-%d)
$ 
$ echo $SAT
2016-04-09
$ echo $SUN
2016-04-10
$ 

Eu sei como posso listar as próximas datas para sábado e domingo.

Como posso listar todos os próximos sábados e domingos nos próximos 6 meses?

Estou usando o bash no Ubuntu.

    
por LoukiosValentine79 07.04.2016 / 17:50

3 respostas

4

Depois de ter uma data inicial inicial para um sábado e / ou domingo, você pode usar datas relativas para fazer isso em um script bash usando um loop.

#!/bin/bash

SAT=$(date -dsaturday +%Y-%m-%d)
SUN=$(date -dsunday +%Y-%m-%d)
# 365 days/year / 2 ~= 182 days
ENDSAT=$(date -d "$SAT + 182 days" +"%Y-%m-%d")
ENDSUN=$(date -d "$SUN + 182 days" +"%Y-%m-%d")

echo $SAT
echo $SUN

until [ "$SUN" == "$ENDSUN" ]; do
  SAT=$(date -d "$SAT + 7 days" +%Y-%m-%d)
  SUN=$(date -d "$SUN + 7 days" +%Y-%m-%d)
  echo $SAT
  echo $SUN
done

Eu não uso "+ 6 meses" na configuração inicial porque isso pode causar uma ligeira mudança no dia da semana, já que os meses têm quantidades diferentes de dias.

    
por 07.04.2016 / 18:16
2

A maneira mais simples de apresentar os finais de semana em formato legível por humanos será:

cal -A6

Que imprimirá a próxima cal endar:

                            2016
       April                  May                   June          
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
                1  2   1  2  3  4  5  6  7            1  2  3  4  
 3  4  5  6  7  8  9   8  9 10 11 12 13 14   5  6  7  8  9 10 11  
10 11 12 13 14 15 16  15 16 17 18 19 20 21  12 13 14 15 16 17 18  
17 18 19 20 21 22 23  22 23 24 25 26 27 28  19 20 21 22 23 24 25  
24 25 26 27 28 29 30  29 30 31              26 27 28 29 30        


        July                 August              September        
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  
                1  2      1  2  3  4  5  6               1  2  3  
 3  4  5  6  7  8  9   7  8  9 10 11 12 13   4  5  6  7  8  9 10  
10 11 12 13 14 15 16  14 15 16 17 18 19 20  11 12 13 14 15 16 17  
17 18 19 20 21 22 23  21 22 23 24 25 26 27  18 19 20 21 22 23 24  
24 25 26 27 28 29 30  28 29 30 31           25 26 27 28 29 30     
31                                                                

      October         
Su Mo Tu We Th Fr Sa  
                   1  
 2  3  4  5  6  7  8  
 9 10 11 12 13 14 15  
16 17 18 19 20 21 22  
23 24 25 26 27 28 29  
30 31                 

Se você precisar de uma lista de somente aos sábados e domingos:

nextsat="$(date -d "next sat" +%Y-%m-%d)"
for i in {0..26}; do
    date -d "$nextsat +$((i*7))   day" +%a-%Y-%m-%d
    date -d "$nextsat +$((i*7+1)) day" +%a-%Y-%m-%d
done

O intervalo de 6 meses (meio ano) é (cerca de) ~ 182 dias, mas a menos que as condições especiais sejam de 26 semanas. Essa é a razão para {0..26} . Esta semana é a semana zero e mais 26. Se estritamente 26 semanas forem necessárias, use {0..25}.

    
por 07.04.2016 / 20:06
0
#!/bin/bash
WEEK=0
END_MONTH=$(('date -d "6 months" +%m' + 1)) |sed 's/^0//'
while true; do
    CURRENT_MONTH='date -d "$WEEK weeks" +%m'|sed 's/^0//'
    if [[ $CURRENT_MONTH -ne $END_MONTH  ]]; then
            date -d "$WEEK weeks saturday" +%Y-%m-%d
            date -d "$WEEK weeks sunday" +%Y-%m-%d
    else
            #$END_MONTH reached... exiting
            exit 0
    fi
    let "WEEK++"
done
    
por 07.04.2016 / 18:25