1

我需要通过日期范围更改一年中的周数,例如

我有 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 是一年中的一周,脚本的输出是日期范围

4

2 回答 2

5

这将适用于带有 bash 的 linux,假设“周数”是指 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
于 2013-05-30T20:21:28.347 回答
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
于 2013-05-30T20:19:55.437 回答