如何知道該月的最後一個星期日

如何知道該月的最後一個星期日

我嘗試在 ESXI 上編寫腳本,我需要添加“如果該月的最後一個星期日”。我嘗試

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

它不能工作,但在 Debian 上可以工作。

在 ESXI 上現在輸出 August

答案1

我相信問題是

給定一個特定日期,我可以確定它是否是該月的最後一個星期日嗎?

而不是更普遍的問題

給定一個特定的月份,它的最後一個星期日是哪一天?

有鑑於此,我們可以將問題分為兩部分:

  • 日期是星期日嗎?
  • 是這個月的最後一週嗎?

對於第一部分,測試很簡單:

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

我們可以測試一下:

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

現在,為了測試是否是該月的最後一周,我們可以在日期上添加一周,看看這是否為我們提供了下個月的前 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命令匹配以零個或多個空格開頭,後面跟著一個數字的行,並將第一個欄位儲存到變數中d。最後,d將是當月的最後一個星期日。

答案3

我在嘗試獲取最後星期四時發現了這篇文章,但它也適用於其他任何一天。這是我的解決方案(與 Bash 相容):

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

本質上,它檢查下週的某一天是否出現在同一個月。應該適用於 12 月/1 月過渡,因為我使用的-ne-geor -gt

答案4

對於該月的最後一個星期日:

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

對於該月的第一個星期日:

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

相關內容