用bash中的日期范围更改星期数

时间:2013-05-30 19:00:25

标签: linux bash shell sh

我需要按日期范围更改一年中的星期数,例如

我在2013年的第46周

日期范围是:

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

我不知道我能用bash做到吗

该数字是脚本的参数,例如,如果脚本调用convertir.sh,则使用

convertir.sh 2013 46

其中2013年是一年,46是一年中的一周 并且脚本的输出是日期范围

2 个答案:

答案 0 :(得分:5)

这将在linux上使用bash,假设“周数”表示ISO周数。 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-
}

编辑:这是一个版本,它可以减少工作量来获得相同的结果:

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

答案 1 :(得分: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