特定の日以降の次の土曜日の日付が必要です。たとえば、$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.
dateround
dateutils.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をインストールする必要があります。