月の最終日曜日を知る方法

月の最終日曜日を知る方法

ESXIでスクリプトを書いてみましたが、「月の最終日曜日の場合」を追加する必要があります。

date -d @$(( $(date -d $(date -d @$(( $(date +%s) + 2678400 )) +%Y%m01) +%s) - 604800 )) +%d

動作しませんが、Debian では動作します。

ESXIで8月を出力するようになりました

答え1

問題は

特定の日付が与えられた場合、それがその月の最後の日曜日かどうかを判断できますか?

より一般的な質問ではなく

特定の月の場合、その月の最後の日曜日は何日ですか?

これを踏まえると、問題を 2 つに分けることができます。

  • 日付は日曜日ですか?
  • 今月最後の週ですか?

最初の部分のテストは簡単です。

date -d "$date" +%a  # outputs "Sun" for a Sunday

次のことをテストできます:

test $(date -d "$date" +%a) = Sun  # success if $date is a Sunday

さて、それが月の最後の週であるかどうかをテストするには、日付に 1 週​​間を追加し、それが次の月の最初の 7 日間のいずれかになるかどうかを確認します。

test $(date -d "$date + 1week" +%e) -le 7

の曜日は の曜日$date + 1weekと同じなので$date、テストの両方の部分を一度に生成し、Bash 正規表現テストを使用できます。

if [[ $(date -d "$date + 1week" +%d%a) =~ 0[1-7]Sun ]]
then
    echo "$date is the last Sunday of the month!"
fi

テスト済み:

$ ./330571.sh 2016-12-01
$ ./330571.sh 2016-12-04
$ ./330571.sh 2016-12-25
2016-12-25 is the last Sunday of the month!
$ ./330571.sh 2017-01-28
$ ./330571.sh 2017-01-29
2017-01-29 is the last Sunday of the month!

答え2

calこれはとを使用して実行できますawk

$ cal | awk '/^ *[0-9]/ { d=$1 } END { print d }'
25

説明

cal現在の月を日曜日を最初の列として出力します (デフォルト):

$ cal
    December 2016
Su Mo Tu We Th Fr Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

このawkコマンドは、0 個以上のスペースで始まり、その後に数字が続く行に一致し、最初のフィールドを変数に格納しますd。最後に、dは現在の月の最後の日曜日になります。

答え3

最終木曜日を取得しようとしたときにこの記事を見つけましたが、他の曜日でも機能します。これが私の解決策です (Bash と互換性があります)。

thisThursInMonth=`date +%m`
nextThursInMonth=`date -d 'next thursday' +%m`
if [ $nextThursInMonth -ne $thisThursInMonth ]
...etc...

本質的には、次の週の曜日が同じ月にあるかどうかをチェックします。または-neの代わりにを使用したので、12 月/1 月の遷移に機能するはずです。-ge-gt

答え4

今月最後の日曜日:

if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date + 1week" +%m) ]]

毎月第 1 日曜日:

if [[ $(date -d "$date" +%a) = Sun && $(date -d "$date" +%m) != $(date -d "$date - 1week" +%m) ]]

関連情報