Especifique limites de semana consistentes usando data

2

Eu preciso executar um determinado programa passando os limites da semana. (Eu uso CentOS release 6.4 , então uma solução bash / gnu date está bem). Eu tentei isso ontem (na segunda-feira):

for ((w=1;w<=6;w++)) do 
  week=$(date --date "$w weeks ago" +"%G-%V")
  beg=$(date --date "monday $w weeks ago" +"%F")
  end=$(date --date "sunday $w weeks ago" +"%F")
  echo "$week beg=$beg end=$end" $(( ($(date --date $end +"%s") - $(date --date $beg +"%s")) / 86400 ) + 1) "days"
done
2014-02 beg=2014-01-06 end=2014-01-12 7 days
2014-01 beg=2013-12-30 end=2014-01-05 7 days
2013-52 beg=2013-12-23 end=2013-12-29 7 days
2013-51 beg=2013-12-16 end=2013-12-22 7 days
2013-50 beg=2013-12-09 end=2013-12-15 7 days
2013-49 beg=2013-12-02 end=2013-12-08 7 days

parece bom, mas quando eu faço a mesma coisa hoje (terça-feira), eu entendo isso:

2014-02 beg=2014-01-13 end=2014-01-12 0 days
2014-01 beg=2014-01-06 end=2014-01-05 0 days
2013-52 beg=2013-12-30 end=2013-12-29 0 days
2013-51 beg=2013-12-23 end=2013-12-22 0 days
2013-50 beg=2013-12-16 end=2013-12-15 0 days
2013-49 beg=2013-12-09 end=2013-12-08 0 days

que não parece bom.

Então, como chamar date para obter os limites da semana no passado?

    
por sds 14.01.2014 / 17:34

2 respostas

1

O problema é que, dependendo do dia atual, "Sunday x weeks ago" pode estar antes de "Monday x weeks ago":

  • Se hoje for segunda-feira, "Domingo x semanas atrás"="segunda-feira x semanas atrás" + 6
  • Se hoje não for segunda-feira, "Domingo x semanas atrás"="segunda-feira x semanas atrás" - 1

Em vez de usar "Sunday x weeks ago" e "Monday x weeks ago", será mais fácil realizar "Sunday x weeks ago" e "Sunday x weeks ago - 6 days".

Com algumas outras correções de erros e simplificações, aqui está seu script atualizado:

#!/bin/bash
for ((w=1;w<=6;w++)); do 
    end=$(date --date "sun $w weeks ago" +%F)
    beg=$(date --date "sun $w weeks ago - 6 days" +%F)
    week=$(date --date "$beg" +%G-%V)
    echo "$week beg=$beg end=$end" $((($(date --date $end +%s) - $(date --date $beg +%s)) / 86400 + 1 )) "days"
done

Observe que alterei também a configuração de week para ser baseada em beg .

No entanto, você ainda precisa ter em mente qual domingo você quer escolher no domingo: hoje ou na semana anterior? Este roteiro vai escolher o domingo da semana anterior, nunca hoje. Se não for isso que você deseja, convém repensar os cálculos com base na segunda-feira em vez de no domingo: "Segunda-feira x semanas atrás" e "Segunda-feira x semanas atrás + 6 dias":

for ((w=1;w<=6;w++)); do 
    beg=$(date --date "mon $w weeks ago" +%F)
    end=$(date --date "mon $w weeks ago + 6 days" +%F)
    week=$(date --date "$w weeks ago" +%G-%V)
    echo "$week beg=$beg end=$end" $((($(date --date $end +%s) - $(date --date $beg +%s)) / 86400 + 1 )) "days"
done
    
por 14.01.2014 / 19:09
0

Você pode usar date +%u para encontrar a segunda-feira e o domingo em relação a uma determinada data.

Supondo que "0 semanas atrás" é esta semana.

for ((w=1;w<=6;w++)); do 
    when=$(date --date "$w weeks ago")
    beg_offset=$(( $(date --date "$when" +%u) - 1))
    beg=$(date --date "$when - $beg_offset days" +"%F")
    end_offset=$((6 - beg_offset))
    end=$(date --date "$when + $end_offset days" +"%F")
    week=$(date --date "$when" +"%G-%V")
    days=$(( ( $(date --date "$end" +"%s") - $(date --date "$beg" +"%s") ) / 86400 + 1))
    echo "$week beg=$beg end=$end $days days"
done
    
por 14.01.2014 / 20:02

Tags