1年中すべての日曜日の日付を検索するスクリプト

1年中すべての日曜日の日付を検索するスクリプト

年間54日目の日曜日の日付を印刷したいと思います。次のスクリプトを作成しましたが、出力にエラーが発生します。

スクリプト:

req_date=`date +%m%d%Y`

for i in {1..54}

do
   NEXT_DATE=$(date +%m%d%Y -d "$req_date +  7*$i day")
   echo "$NEXT_DATE"
done

出力

+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 +  7*32 day'
date: invalid date ‘11132019 +  7*32 day’
+ NEXT_DATE=
+ echo ''

+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 +  7*33 day'
date: invalid date ‘11132019 +  7*33 day’
+ NEXT_DATE=
+ echo ''

+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 +  7*34 day'
date: invalid date ‘11132019 +  7*34 day’
+ NEXT_DATE=
+ echo ''

+ for i in '{1..54}'
++ date +%m%d%Y -d '11132019 +  7*35 day'
date: invalid date ‘11132019 +  7*35 day’
+ NEXT_DATE=
..

誰かが私を助けることができますか?

答え1

存在するksh93

printf '%(%Y-%m-%d)T\n' '2020-01 '{1..52}'th Sunday'

2020年の全52日曜日のリストを提供します(より便利で明確な形式で提供されますが、YYYY-MM-DD本当に(本当に?)必要に応じていつでも変更できます)。%m%d%Y

printf '%(%Y-%m-%d)T\n' '2023-01 '{1..53}'th Sunday'

2023年には53。

年に日曜日は54日にすることはできません。

年に54人がいる可能性がありますそのうちの2つは完了していないため、date +%W00〜53の値を使用できますが、00週または53週のうち少なくとも1つの日曜日は隣接する年に属します(そして00週または53週が1年以上に属することがあります)。 ; ISOの週番号()を使用すると、%Vこれを防ぎ、01から53まで進みます。

答え2

私の答えは開始日から30週間のすべての木曜日で、最初の木曜日を選択する順序を使用します。

paul@debian:~$         
strt="2023/06/01"
for i in `seq 0 30`;
        do
                echo "datum  $i $(date -d "${strt}+${i} week  " +"%A/%d/%m/%Y" )"
        done

datum  0 Thursday/01/06/2023
datum  1 Thursday/08/06/2023
datum  2 Thursday/15/06/2023
datum  3 Thursday/22/06/2023
datum  4 Thursday/29/06/2023
datum  5 Thursday/06/07/2023
datum  6 Thursday/13/07/2023
datum  7 Thursday/20/07/2023
datum  8 Thursday/27/07/2023
datum  9 Thursday/03/08/2023
datum  10 Thursday/10/08/2023
datum  11 Thursday/17/08/2023
datum  12 Thursday/24/08/2023
datum  13 Thursday/31/08/2023
datum  14 Thursday/07/09/2023
datum  15 Thursday/14/09/2023
datum  16 Thursday/21/09/2023
datum  17 Thursday/28/09/2023
datum  18 Thursday/05/10/2023
datum  19 Thursday/12/10/2023
datum  20 Thursday/19/10/2023
datum  21 Thursday/26/10/2023
datum  22 Thursday/02/11/2023
datum  23 Thursday/09/11/2023
datum  24 Thursday/16/11/2023
datum  25 Thursday/23/11/2023
datum  26 Thursday/30/11/2023
datum  27 Thursday/07/12/2023
datum  28 Thursday/14/12/2023
datum  29 Thursday/21/12/2023
datum  30 Thursday/28/12/2023

答え3

変更されたスクリプトは次のとおりです。

  • セットリクエスト日正しいのはdd/mm/yyyで、次の日曜日です。
  • 日付オフセット計算にbash構文を使用する
  • ループはインデックス1ではなく0から始まるので、54ではなく53で終わります。
req_date=`date +%m/%d/%Y -d sunday`

for i in {0..53}
do
    NEXT_DATE=$(date +%m%d%Y -d "$req_date +  $((7*i)) days")
    echo "$NEXT_DATE"
done

答え4

0週間または54週間の問題を回避するには、基準に基づいてすべての日付を繰り返し、すべての日曜日を選択できます。

#!/bin/bash

#get day of year number for last day of year
total_days=$(date -d'2019-12-31' +%j)

#loop over all days and select Sundays
for (( i=0 ; i<${total_days} ; i++ )) ; do
  date -d"2019-01-01 + ${i}" +"%a %Y-%m-%d" | grep Su | cut -d' ' -f2
done

req_dateまた、年中すべての日曜日の開始日を指定するには、このオプションを使用する必要があります-d。 (次の54日曜日から始めたくない場合req_date


あなたの質問に記載されている問題に関して:

コメントですでに述べたように、入力形式が正しくありません。可能な日付入力文字列はやや複雑で解釈するのは直感的ではないので、やや拡張されますが、詳細についてはで説明しますinfo "date input formats"。これは長い説明です。ハイフンやスラッシュを使用しないので、ここでは

29.8 日付文字列の純粋な数値

10進数がYYYYMMDD形式で、日付文字列の前に別のカレンダー日付項目(*カレンダー日付項目注::)が表示されない場合、YYYYは年として読み取られ、MMは月として読み取られます。 DD は、日付が指定したカレンダー日付の月として読み込まれます。

したがって、あなたの日付11132019は存在しない1113-20-19なので失敗します。

個人的には、私は上記のスクリプトに示されているように、米国の日付形式と他の日付形式との間の混乱を排除するためにyyyy-mm-ddを使用することを好みます。

関連情報