日付 - 次の勤務日を取得する方法(週末は無視)

日付 - 次の勤務日を取得する方法(週末は無視)

特定の時間にサーバーを一時停止して起動するためにクローンジョブを設定しています。

2つのコマンドを使用しています。月曜日から木曜日まで運営:

rtcwake -m mem -t $(date +%s -d "08:00")

もう一つは金曜日に実行されます:

rtcwake -m mem -t $(date +%s -d "monday 08:00")

この分離を不要にすることが可能かどうか疑問に思います。dateこの言葉を理解できれば、状況next weekday 08:00は非常に単純化されます。

これが実際に可能かどうか、どの構文を使用するべきかを見つけることができません。

私は基本的に、土曜日と日曜日にサーバーが目を覚ますのを避けたいと思います。

答え1

を使用したい場合はksh93、「次の営業日0800」を簡単に計算できます。アメリカに住んでいると仮定すると、平日の最初の営業日は通常月曜日です。

$ printf "%T\n"                
Tue Jan  5 16:04:37 GMT 2021
$ printf "%T\n" "0 8 * * 1"
Mon Jan 11 08:00:00 GMT 2021
$ printf "%(%s)T\n" "0 8 * * 1"
1610352000
$ 

上記の仕組みの鍵は、"0 8 * * 1"5つのcrontab時間と日付フィールドを表す文字列です。crontab(5)これらのフィールドの詳細については、マンページを参照してください。

ksh93時間形式がこの準クローンタブ項目形式の特定の部分を認識し、その日付を指定された形式で出力することを知っている人はほとんどいません。

答え2

試してみたいかもしれません

date +%s -d"$(( ( $(date +%w)==5 )?3:1 ))days 8:00"

編集する:あなたのコメントに答えるには、 date +%w曜日が作成され、「条件付き演算子」(expr?expr:expr)として計算されます。 expr1 が TRUE と評価された場合、expr2 が計算され使用され、そうでなければ expr3 が使用されます。だから金曜日が5日目であり、date +%s -d"3days 8:00残りの日も続くのですdate +%s -d"1days 8:00

答え3

同様のニーズについて私が思いついたアイデアがあります。他の答えよりも詳細ですが、それが何をしているのかをより明確にすることができます。

last_workday() {
    from_date="${@:-today}"
    day_of_week=$(date +%w --date="${from_date}")

    if [ ${day_of_week} = "0" ] ; then
        look_back=2
    elif [ ${day_of_week} = "1" ] ; then
        look_back=3
    else
        look_back=1
    fi

    date -d "${from_date} - ${look_back} day" +'%Y/%m/%d'
}

next_workday() {
    from_date="${@:-today}"
    day_of_week=$(date +%w --date="${from_date}")
    if [ ${day_of_week} = "5" ] ; then
        look_forward=3
    elif [ ${day_of_week} = "6" ] ; then
        look_forward=2
    else
        look_back=1
    fi

    date -d "${from_date} + ${look_forward} day" +'%Y/%m/%d'
}

for i in $(seq 16); do
    now=$(date +'%Y/%m/%d' --date="today + ${i} day")
    prev=$(last_workday "${now}")
    next=$(next_workday "${now}")
    echo "${now}:  ${prev} ${next}"
done

関連情報