与えられた日付から次の土曜日の日付を取得します。

与えられた日付から次の土曜日の日付を取得します。

特定の日以降の次の土曜日の日付が必要です。たとえば、$date1="30-AUG-2015"05-SEP-2015という結果が必要です。

私は成功せず、次のコマンドをすべて試しました。

samba@samba:~$ date1="30-AUG-2015"
samba@samba:~$ date2=$(date --date='"$date1" +next Saturday')
date: invalid date ‘"$date1" +next Saturday’

samba@samba:~$ date1="30-AUG-2015"
samba@samba:~$ date2=$(date --date1='next Saturday')
date: unrecognized option '--date1=next Saturday'
Try 'date --help' for more information.

samba@samba:~$ date1="30-AUG-2015"
samba@samba:~$ date -d "$date1 next saturday"
Sun Aug 30 00:00:00 IST 2015
samba@samba:~$ $date1 -d "next saturday"
30-AUG-2015: command not found

答え1

私は強くお勧めします日付ツールこのようなことのために。

Fedora Linux 21+またはCentOS / RHEL(EPELを含む):

dnf install dateutils 

yum以前のバージョンのRHELではDNFの代わりに)

Debianベースのシステムでは、パッケージを呼び出すこともできますが、関連しないパッケージと同じ名前のコマンドといくつかのパッケージを区別するために、コマンドの前にdateutilsプレフィックスが付けられます(したがって、以下のコマンドで置き換えられます)。dateutils.daterounddateutils.dround

次に、次のようにします。

dateround today sunday

「今日」を使用するか、実際の日付に置き換えることができます。

$ dateround 2015-08-30 saturday
2015-09-05

2015 年 8 月 30 日など、特定の形式で日付を入力する必要がある場合は、次のように、または-iオプションを使用できます。--input-format

$ dateround -i '%d-%b-%Y' 30-AUG-2015 saturday
2015-09-05

「dateround」という名前からすぐにはわかりませんが、このコマンドは丸め- つまり、月曜日は前の日曜日にロールバックされません。一致するものがある場合、デフォルトでは現在の日付も返されます。たとえば、今日が日曜日の場合、dateround today sunday今日の日付が提供されます。常に将来の日付になるようにこの--nextフラグを追加してください。

答え2

そしてksh93

$ LC_ALL=C ksh93 -c 'printf "%(%c)T\n" "30-Aug-2015 Saturday"'
Sat Sep  5 00:00:00 2015

日付が土曜日の場合、同じ日に返されます。次の土曜日が欲しいなら、

LC_ALL=C printf "%(%c)T\n" "30-Aug-2015 tomorrow Saturday"

ご希望の仕様%cに交換してください。strftime

$ LC_ALL=C printf "%(%d-%b-%Y)T\n" "03-Jan-2015 tomorrow saturday"
10-Jan-2015

これを行うには、10-JAN-2015次のように宣言された変数に割り当てますtypeset -u

typeset -u date=${
  LC_ALL=C printf "%(%d-%b-%Y)T\n" "03-Jan-2015 tomorrow saturday"
}

GNUを介して実装date:

$ d=03-JAN-2015
$ LC_ALL=C date -d "$d +1 week -$(date -d "$d +1 day" +%w) day" '+%d-%^b-%Y'
10-JAN-2015

答え3

毎日、毎週、繰り返しが不要な断線ソリューション

MON=1
TUE=2
WED=3
THU=4
FRI=5
SAT=6
SUN=7

echo "Today "          && date
echo "Next Monday "    && date -d "+ $(( ( (6 + $MON - $(date +%u)) % 7) + 1 )) days"
echo "Next Tuesday "   && date -d "+ $(( ( (6 + $TUE - $(date +%u)) % 7) + 1 )) days"
echo "Next Wednesday " && date -d "+ $(( ( (6 + $WED - $(date +%u)) % 7) + 1 )) days"
echo "Next Thursday "  && date -d "+ $(( ( (6 + $THU - $(date +%u)) % 7) + 1 )) days"
echo "Next Friday "    && date -d "+ $(( ( (6 + $FRI - $(date +%u)) % 7) + 1 )) days"
echo "Next Saturday "  && date -d "+ $(( ( (6 + $SAT - $(date +%u)) % 7) + 1 )) days"
echo "Next Sunday "    && date -d "+ $(( ( (6 + $SUN - $(date +%u)) % 7) + 1 )) days"

出力

Today
Thu, Nov 12, 2020 10:24:38 PM
Next Monday
Mon, Nov 16, 2020 10:24:39 PM
Next Tuesday
Tue, Nov 17, 2020 10:24:40 PM
Next Wednesday
Wed, Nov 18, 2020 10:24:40 PM
Next Thursday
Thu, Nov 19, 2020 10:24:41 PM
Next Friday
Fri, Nov 13, 2020 10:24:42 PM
Next Saturday
Sat, Nov 14, 2020 10:24:42 PM
Next Sunday
Sun, Nov 15, 2020 10:24:43 PM

説明する

1週間の2日目までの日数を計算し、この数字を現在の日付に追加するのがアイデアです。土曜日を例に挙げましょう。

  • 月曜日+ 5日
  • ...
  • 金曜日+1日
  • 土曜日+ 7日
  • 日曜日+ 6日

したがって、アルゴリズムの最初の反復は現在の曜日を取り、date +%uモジュラスがゼロから始まるので、追加するmod 7ように見えます。1

( $(date +%u) % 7) + 1

ただし、降順(5,4,3,2,1,7,6)で日付を追加することは考慮されません。これに対応するには、現在の曜日を差し引いてモジュロを7取り、次を追加する必要があります1

( (7 - $(date +%u)) % 7) + 1

これは7 == 6 + $MON月曜日( )の実際のケースを提供します。特定の曜日を検索するには、次のように書き直す必要があります。

( (6 + <DAY> - $(date +%u)) % 7) + 1

<DAY>上記の変数の1つはどこにあるべきですか($MON... $SUN

Alpine Linuxの修正

Alpine Linuxはこれをサポートしていないため、機能するには-d "+ 3 days"インストールcoreutils ()または直接計算する必要があります。apk add coreutils

date -d "@$(($(date +%s) + 86400 * $(( ( (6 + $SAT - $(date +%u)) % 7) + 1 )) ))"

説明する

$(date +%s)その後経過した時間を出力します…!わかりました!日付が復元される86400日付あたりの秒数。date -d "@<number_of_seconds>"

Macオペレーティングシステムの修正

date -d "@<number_of_seconds>"を書くdate -r "<number_of_seconds>"のではなく、MacOSを除いて「Alpine Linuxの修正」と同様に動作するので、

date -r "$(($(date +%s) + 86400 * $(( ( (6 + $SAT - $(date +%u)) % 7) + 1 )) ))"

詳細については、上記の「Alpine Linuxの修正/注意事項」を参照してください。

答え4

より簡単な解決策は次のとおりです。

$ adate1="30-AUG-2015"

$ faketime "$adate1" date -d 'saturday' +'%d-%b-%Y'

05-Sep-2015

もちろん、faketimeをインストールする必要があります。

関連情報