#!/bin/bashにあります。その月の最初の営業日の日付を取得するUnixコマンド

#!/bin/bashにあります。その月の最初の営業日の日付を取得するUnixコマンド

私は次の月の最初の日曜日、次の月の最初の月曜日、次の月の最初の火曜日、来月の最初の水曜日などを取得する単純なUnixコマンドを探しています。

  1. 完全な日付形式が必要です(時間は必須ではありません)。

  2. 2、3、4などの数字を取得できます。数字だけが必要ではないため、日付形式(日、月、年を含む)が必要です。

    $ NEXT_MONTH=`date +'%m %Y' -d 'next month'`
    $ echo $NEXT_MONTH
    04 2017
    
    $ NEXT_SUNDAY=`cal $NEXT_MONTH | awk 'NF==7 && !/^Su/{print $1;exit}'`
    $ echo $NEXT_SUNDAY
    2
    
  3. メールグループに通知を送信するには、この日付が必要です。

たとえば、次のように来月の最初の土曜日を取得できます。

$ firstofmonth=$(date -d '+1 months' '+%Y%m01')
20170401

$ firstsaturday=$(date -d "$firstofmonth" '+%Y-%m')-$((7 - \
                $(date -d "$firstofmonth" '+%u')     ))    
2017-04-1

答え1

存在するksh93

$ printf '%(%F)T\n' 'next month, first Monday'
2017-04-03

bash%(<format>)T、4.2は現在buitinでaをサポートしていますprintfが、そのような日付式を解析する機能はサポートしていません。

必ず使用する必要がbashあり、使用したい場合は%(<format>)Tフォークしなくても使用できます。たとえば、次のようになります。

printf -v code '%(
  t=$((%s + (12 - %-H) * 60 * 60))
  increment=$((8 - %u))
  current_month=%m)T' -1
eval "$code"
until
  t=$((t + increment * 24 * 60 * 60)) # next Monday around mid-day
  printf -v code '%(date=%F month=%m)T' "$t"
  eval "$code"
  [ "$month" != "$current_month" ] # until be get to next month
do
  increment=7 # the first increment is the number of days
              # til Monday. Next increments are just a week.
done
echo "$date"

答え2

GNU date-d自分のものを使用している)とzsh次のシェルを想定します{1..7}

$ for i in {1..7} ; do \
    LC_ALL=C date '+%Y-%m-%d %a' -d "$(date +%Y%m0${i}) next month" ; \
  done | awk '/Mon/ {print $1}'
2017-04-03

awk Mon希望の曜日に置き換えられます(LC_ALL=Cユーザーのロケールに関係なく、英語の月名を取得するために使用されます)。また、曜日ごとに再クエリする場合は、変数に保存することをお勧めします。

$ days=$(for i in {1..7} ; do \
           LC_ALL=C date '+%Y-%m-%d %a' -d "$(date +%Y%m0${i}) next month" ; \
         done)

$ for i in Mon Tue Wed Thu Fri Sat Sun ; do \
    echo "${days}" | awk "/${i}/"'{print $1}' ; \
  done
2017-04-03
2017-04-04
2017-04-05
2017-04-06
2017-04-07
2017-04-01
2017-04-02

答え3

実際にシステムで利用可能な場合、PHPはテキスト入力から日付を非常に簡単に解析できます。

例:

bash-[522]$ php -qr 'date_default_timezone_set("UTC"); echo date("d-m-Y\n", strtotime("first monday of next month"));'
03-04-2017

私の.bashrcには次の機能があります。

get_date ()
{
    text="$*";
    php -qr "date_default_timezone_set(\"UTC\"); echo date(\"d-m-Y\n\", strtotime(\"$text\"));"
}

私はそれを次のように使用できます:

bash-[523]$ get_date first monday of next month
03-04-2017

編集する使用するオプションを追加cal

ほとんどすべてのシステムにbashこの機能がありますcal。カレンダープログラム。次のようにcaldateおよびの組み合わせを実行して、週の最初の日の日付リストを取得できます。awk

 cal -hN $(date -d 'next month' +%b' '%Y) | grep -v $(date -d 'next month' +%b) | awk -v date=$(date -d 'next month' +%Y-%m-) '{ printf "%s: "date"%02i\n", $1, $2; }'

すると、次のような結果が出力されます。

Su: 2017-04-02
Mo: 2017-04-03
Tu: 2017-04-04
We: 2017-04-05
Th: 2017-04-06
Fr: 2017-04-07
Sa: 2017-04-01

その月の最後の日付を取得するように$2awkステートメントを変更してください。$NF

答え4

来月のすべての日付と平日を一覧表示できます。

# for i in `seq 1 93`; do date '+%Y-%m-%d %w' -d "+$((i - 31)) days"; done | sed 's|0$|7|g' | grep `date +"%Y-%m" --date="$(date +%Y-%m-15) 1 month"`
2021-02-01 1
2021-02-02 2
2021-02-03 3
2021-02-04 4
2021-02-05 5
2021-02-06 6
2021-02-07 7
2021-02-08 1
2021-02-09 2
2021-02-10 3
2021-02-11 4
2021-02-12 5
2021-02-13 6
2021-02-14 7
2021-02-15 1
2021-02-16 2
2021-02-17 3
2021-02-18 4
2021-02-19 5
2021-02-20 6
2021-02-21 7
2021-02-22 1
2021-02-23 2
2021-02-24 3
2021-02-25 4
2021-02-26 5
2021-02-27 6
2021-02-28 7

毎月最初の日曜日を取得するには、以下を追加します。| grep 7$ | head -n 1

それだけです。


トピック外:毎月最後の金曜日を取得します。| grep 5$ | tail -n 1

トピックから抜け出す:今月に商品を購入し、1 month次に変更してください。0 month

関連情報