私はコマンドがdate -d 'last-monday - 14 days' +%Y%m%d
「今日の日付」から2週間前の月曜日を印刷することを知っています。さまざまな日に状況をテストして結果を確認する方法が必要です。相対日付を計算するには、dateコマンドに言及する必要があるようです。
次のようなさまざまな日付をテストするには何かが必要です。
date -d 'last-monday - 14 days' %Y%m%d from 20190315
date -d 'last-monday - 14 days' %Y%m%d from 20180217
date -d 'last-monday - 14 days' %Y%m%d from 201700914
そして、対応する出力を表示します。
答え1
#!/bin/bash
# Our given dates
dates=(
20190315
20180217
20170914
)
# Loop over the given dates
for thedate in "${dates[@]}"; do
# Get day of the week as digit (1 is Monday, 7 is Sunday)
day=$( date -d "$thedate" +%u )
# The Monday the same week is $(( day - 1 )) days earlier than the given date.
# The Monday two weeks earlier is 14 days earlier still.
date -d "$thedate -$(( day - 1 + 14 )) days" +"$thedate --> %Y%m%d"
done
出力:
20190315 --> 20190225
20180217 --> 20180129
20170914 --> 20170828
--date
難しいのは、GNUが最終日を計算するために正しい文字列を作成する方法を見つけることです。私は与えられた日付の曜日を計算し、それを使って与えられた日付を数日間オフセットする日付文字列を計算し、結果の日付が2週間前の月曜日になるように選択しました。-d
date
上記のスクリプトでは、オプションパラメータに使用される実際の文字列-d
(スクリプトで指定された日付を使用)は次のとおりです。
20190315 -18 days
20180217 -19 days
20170914 -17 days
単一の日付に対して計算を実行する単一のコマンドでスクリプトを圧縮します$thedate
。
date -d "$thedate -$(date -d "$thedate" +%u) days -13 days" +%Y%m%d
または
date -d "$thedate -$(date -d "$thedate" +"-%u days -13 days")" +%Y%m%d
答え2
$ date
Wed Mar 20 15:02:23 MST 2019
$ date -d "last-monday"
Mon Mar 18 00:00:00 MST 2019
$ date -d "last-monday - 1 week"
Mon Mar 11 00:00:00 MST 2019
答え3
少なくともDebianにはfaketime
パッケージがあります
faketime '2019-03-15' date
Fri 15 Mar 00:00:00 GMT 2019
faketime '2019-03-15' date --date 'last monday - 14 days'
Mon 25 Feb 00:00:00 GMT 2019
答え4
私は「再利用可能なツール」アプローチを取ろうとします。
私のmonday
スクリプト:
#!/bin/bash
date=${1:-now}
shift
dow=`date +%u -d "$date"`
dow0=$[ $dow - 1 ]
date -d "$date -$dow0 days" "$@"
仕組み:
date -d
最初のコマンドラインパラメータからパラメータを取得します(例:「2020-01-01 -2週」)- 書式設定など、最終日付コマンドに渡される追加パラメータ
+%F
- 曜日を取得するには、%u(1..7)を使用してください。 1は月曜日です。
- 私たちが望む範囲は0〜6なので、1を減算します。
- 指定された日付から「曜日」オフセットを引いた値を表示します。
同様のsunday
スクリプトで結果が少し簡単になりました。
#!/bin/bash
date=${1:-now}
shift
dow=`date +%w -d "$date"`
date -d "$date -$dow days" "$@"
使用法:
# monday
Mon Aug 29 02:28:45 PM AEST 2022
# sunday now +%F
2022-08-28
# monday '2022-12-01' +%F
2022-11-28