如何知道该月的最后一个星期日

如何知道该月的最后一个星期日

我尝试在 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) ]]

相关内容