2013-05-30 1 views
1

мне нужно изменить количество недели в год по диапазону дат, напримеризменить количество недели в диапазоне дат в Баш

у меня есть номер недели 46 в 2013 году

диапазон дат:

2013-11-11 
2013-11-12 
2013-11-13 
2013-11-14 
2013-11-15 
2013-11-16 
2013-11-17 

Я не знаю, могу ли я сделать это с Баш

число является параметром скрипта, например, если вызовы сценария convertir.sh вы используете

convertir.sh 2013 46 

где 2013 год и 46 является неделей года и выход сценария является диапазоном дат

+1

Где номер недели? Дайте текущий вывод вашего скрипта и требуемый вывод вашего скрипта. –

+0

В чем была проблема с разумным ответом в другой теме? http://stackoverflow.com/questions/16842168/change-the-call-from-a-bash-script-in-a-month-to-a-week – tink

+0

Число является параметром сценария, например, если сценарий вызывает convertir.sh, вы используете convertir.sh 2013 46, а выход скрипта - это диапазон дат –

ответ

5

Это будет работать на Linux с Баш, предполагая, что «номер недели», вы имеете в виду номер недели по ISO. Начало недели ИСО в понедельник и неделю считается частью года, если четыре дня в году.

dates_for_week() { 
    printf "January 1 $1 %+d days\n" {-3..368} | 
    date +%G%V_%Y-%m-%d -f - | 
    grep $(printf %d%02d $1 $2) | 
    cut -c8- 
} 

EDIT: Вот версия, которая делает меньше работы, чтобы получить тот же результат:

dates_for_week() { 
    printf "$1-01-01 +$2 weeks %+d days\n" {-10..2} | 
    date +%V_%Y-%m-%d -f - | 
    grep '^0\?'$2_ | 
    cut -c4- 
} 

например:

$ dates_for_week 2013 1 
2012-12-31 
2013-01-01 
2013-01-02 
2013-01-03 
2013-01-04 
2013-01-05 
2013-01-06 
$ dates_for_week 2013 46 
2013-11-11 
2013-11-12 
2013-11-13 
2013-11-14 
2013-11-15 
2013-11-16 
2013-11-17 
$ dates_for_week 2013 52 
2013-12-23 
2013-12-24 
2013-12-25 
2013-12-26 
2013-12-27 
2013-12-28 
2013-12-29 
+0

+1 удивительное решение –

+1

@glennjackman: добавлена ​​версия, которая лучше. Обратите внимание, что одним из способов улучшить ваш ответ является наблюдение, что 4 января всегда находится на 1-й неделе года, или, другими словами, mondayOfWeek1 - последний понедельник не позднее 4 января, который, я думаю, является 'date -d $ (printf «$ year-01-04 -% d days» $ (date +% w -d $ year-01-03)) ' – rici

+0

Почему вы используете {-10..2}? –

0

Я люблю такие вопросы. Требуется GNU дата:

function mondayOfWeek1 { 
    local year=$1 weeknum dayofweek adj=0 
    # iso week num and day of week 
    read weeknum dayofweek < <(date -d "$year-01-01" +"%V %w") 
    # adjust based on wk num 
    ((weeknum != 1 && $dayofweek >= 1)) && ((adj += 7)) 
    # adjust based on day of week 
    ((adj += 1 - dayofweek)) 
    date -d "$year-01-01 + $adj days" +"%Y-%m-%d" 
} 

function mondayOfWeek { 
    local week=$1 
    local year=${2-$(date +%Y)} 
    date -d "$(mondayOfWeek1 $year) + $((week - 1)) weeks" +"%Y-%m-%d" 
} 


monday=$(mondayOfWeek 46) 
for day in {0..6}; do 
    date -d "$monday + $day days" +"%Y-%m-%d" 
done