3

来週の月曜日の日付を計算するにはどうすればよいですか? たとえば、この日に 1 つの変数があるとします。

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`
4

3 に答える 3

4

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
于 2012-10-09T14:56:13.853 に答える
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です。

いつか誰かに役立つことを願っています。

于 2012-10-09T15:03:28.337 に答える
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
}
于 2012-10-09T16:24:52.377 に答える