GNU Dateを使用して、特定の日付より2週間前の月曜日の日付を取得します。

GNU Dateを使用して、特定の日付より2週間前の月曜日の日付を取得します。

私はコマンドが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週間前の月曜日になるように選択しました。-ddate

上記のスクリプトでは、オプションパラメータに使用される実際の文字列-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

関連情報