UNIX日期:如何将周数转换为日期范围(周一至周日)?

hel*_*ish 8 unix bash date sh unix-timestamp

我有从大日志文件中提取的周数列表,它们是使用语法提取的:

$ date --date="Wed Mar 20 10:19:56 2012" +%W;
12
Run Code Online (Sandbox Code Playgroud)

我想创建一个简单的bash函数,它可以将这些周数转换为日期范围.我想函数应该接受2个参数:$ number和$ year,例如:

$ week() { ......... }
$ number=12; year=2012
$ week $number $year
"Mon Mar 19 2012" - "Sun Mar 25 2012"
Run Code Online (Sandbox Code Playgroud)

pyn*_*exj 10

GNU date:

$ cat weekof.sh
function weekof()
{
    local week=$1 year=$2
    local week_num_of_Jan_1 week_day_of_Jan_1
    local first_Mon
    local date_fmt="+%a %b %d %Y"
    local mon sun

    week_num_of_Jan_1=$(date -d $year-01-01 +%W)
    week_day_of_Jan_1=$(date -d $year-01-01 +%u)

    if ((week_num_of_Jan_1)); then
        first_Mon=$year-01-01
    else
        first_Mon=$year-01-$((01 + (7 - week_day_of_Jan_1 + 1) ))
    fi

    mon=$(date -d "$first_Mon +$((week - 1)) week" "$date_fmt")
    sun=$(date -d "$first_Mon +$((week - 1)) week + 6 day" "$date_fmt")
    echo "\"$mon\" - \"$sun\""
}

weekof $1 $2
$ bash weekof.sh 12 2012
"Mon Mar 19 2012" - "Sun Mar 25 2012"
$ bash weekof.sh 1 2018
"Mon Jan 01 2018" - "Sun Jan 07 2018"
$
Run Code Online (Sandbox Code Playgroud)

  • OP 的*周数* 来自“日期 +%W”。你可以尝试: `date --date="2020-05-17 01:00:00" +%W` 输出 `19` 和 `date --date="2020-05-18 01:00:00" + %W` 输出 `20`。 (2认同)
  • GNU 日期手册:`%W - 一年中的周数,星期一为一周的第一天 (00..53)`。也就是说,每周都会从星期一开始,就像我的 func 输出一样。 (2认同)

Dav*_*míd 9

星期一是一周的第一天,ISO 周数

function week2date () {
  local year=$1
  local week=$2
  local dayofweek=$3
  date -d "$year-01-01 +$(( $week * 7 + 1 - $(date -d "$year-01-04" +%u ) - 3 )) days -2 days + $dayofweek days" +"%Y-%m-%d"
}

week2date 2017 35 1
week2date 2017 35 7
Run Code Online (Sandbox Code Playgroud)

输出:

2017-08-28
2017-09-03
Run Code Online (Sandbox Code Playgroud)