我需要按日期范围更改一年中的星期数,例如
我在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是一年中的一周 并且脚本的输出是日期范围
答案 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