BASH:打印下一个星期一的日期

时间:2012-10-09 14:15:24

标签: bash

如何计算下周一的日期? 例如,如果我今天有一个变量:

DAYCHECK=2012-10-24 

下一个星期一的计算不起作用:

date -d $DAYCHECK -dnext-monday +%Y%m%d

更新

我已经解决了这个方法:

numdaycheck=`date -d $DAYCHECK +%u`
sum=$((8-$numdaycheck))
date=`date -d "$DAYCHECK $sum days" +%Y%m%d`

3 个答案:

答案 0 :(得分:2)

如果GNU date(或任何其他date)接受“$ DAYCHECK之后的星期一”的某些变体,我还没有看到它。我想你必须做数学。

$ day_of_week=$( date +%u --date $DAYCHECK)   # 1 = Monday, ... 7 = Sunday
$ date --date "$DAYCHECK +$((8-day_of_week)) days"

如果DAYCHECK已经是星期一,您将在下周一开始。如果您想要DAYCHECK,则需要单独处理:

$ if (( day_of_week == 1 )); then
> date --date "$DAYCHECK"
> else
> date --date "$DAYCHECK +$((8-day_of_week)) days"
> fi

答案 1 :(得分:0)

(不需要echo命令。)

kent$  w=$(date -d2012-10-24 +%u) // here get the weekday index

kent$  echo $w
3

kent$  s=$(((7-$w+2)*3600*24+$(date -d2012-10-24 +%s))) //here get the "next monday" seconds

kent$  echo $s
1351548000

kent$   echo $(date +%Y-%m-%d -d "1970-01-01 UTC $s seconds") //finally we get the date of "next monday"
2012-10-29

所以“2012-10-29”是最终答案。

这种方式并不像chepner那么简单。我发布另一个答案,因为我通常用它进行日期计算。例如,在给定日期添加5小时30分钟。只需更改(7-$w+2)*3600*24部分即可。

希望有一天能帮到某人。

答案 2 :(得分:0)

next_monday() {
  local yi=${1:0:4} mi=${1:5:2} di=${1:8:2}
  mi=${mi#0}
  di=${di#0}
  local yo=$yi mo=$mi do
  do=$(cal -m $mi $yi|awk 'c==1{print$1;exit}NR>2&&/'"$di"'/{c++}')
  if [ "X$do" = X ];then
    ((mo=mi+1))
    if ((mo>12)); then
      ((mo=1,yo=yi+1))
    fi
    do=$(cal -m $mo $yo|awk 'NR>2&&!/^  /{print$1;exit}')
  fi
  printf "%04d-%02d-%02d\n" $yo $mo $do
}