特定の日付を取得する方法

特定の日付を取得する方法

私のスクリプトでは、毎月最初の土曜日の日付を取得する必要があります。以下のコマンドで最後の土曜日の日付を取得できます。

date -d 'last Saturday' +%y%m%d

しかし、最初の土曜日の約束を取ることができませんでした。試してみましたが、 date -d 'First Saturday' +%y%m%d 期待した結果は得られませんでした。

たとえば、私の要件は - 今月(7月) - 最初の土曜日の日付(200704)です。

誰もが毎月最初の土曜日の日付を知るのに役立ちますか?

答え1

そしてksh93

$ ksh93 -c 'printf "%(%y%m%d)T\n" "first saturday"'
200704

答え2

強く打つ

インデントされたコマンドは理解を助けるためのものです。

$ target_day_id=6 # return value of date +%w; Sunday is 0
$ year_month="$(date +%Y-%m)"
$     echo $year_month
2020-07
$ day_id="$(date --date="${year_month}-01" +%w)"
$     echo $day_id
3
$ # July, 1st 2020 was a Wednesday
$ sat1_date="${year_month}-0$(( ( (7+target_day_id-day_id) % 7 ) + 1 ))"
$     echo $sat1_date
2020-07-04
$     # only formatting from now on
$ sat1_date_short="${sat1_date:2}"
$     echo $sat1_date_short
20-07-04
$ sat1_date_short_digits_only="${sat1_date_short//-/}"
$     echo $sat1_date_short_digits_only 
200704

答え3

GNU日付とシェルループの使用:

day=1
until [ $(date +%A -d $(date +%Y-%m-$(printf '%02d' "$day"))) = "Saturday" ]
do 
  ((day++))
done
date +%y%m$(printf '%02d' "$day")

これは、「day」変数を1に初期化してその月の最初の日を表示し、その日の名前が土曜日になるまで毎日繰り返されます。この-dフラグを使用して「現在」以外のタイムスタンプを使用するには、GNU日付が必要です。ループテストは次のように分類されます。

  • [ $(date +%A ...) = "Saturday" ]- 日付(現在のロケールの完全な曜日名を求める)出力を「Saturday」と比較します。
  • date ... -d $(date +%Y-%m-$(printf '%02d' "$day"))- この日付コマンドに表示する日付を指定します(現在時刻を使用しません)-d。日付は、2番目の内部日付コマンドから生成されます。内部日付コマンドが印刷されます。現在時刻%Y は現在の年であり、%m は現在の月である %Y-%m-(日) 形式を使用してループ変数 "day" を渡します。最も内側の printf ステートメントは、単に日付フィールドが 0 で 2 文字で埋められていることを確認します。

最後に、計算された土曜日を使用して、現在の年と月を希望の形式で印刷します。

関連情報