如何使用 cygwin bash 日期实用程序找到当月的第一个星期一?

How can I find the first monday of current month using cygwin bash date utilty?

我需要使用 Cygwin 知道当月的第一个星期一 bash。

这应该可以,但我这里没有要测试的 Cygwin:

#!/bin/bash

# get current year and month:
year=$( date +"%Y" )
month=$( date +"%m" )

# for the first 7 days in current month :
for i in {1..7}
do
  # get day of week (dow) for that date:
  dow=$( date -d "${year}-${month}-${i}" +"%u" )" "

  # if dow is 1 (Monday):
  if [ "$dow" -eq 1 ]
  then
    # print date of that Monday in default formatting:
    date -d "${year}-${month}-${i}"
    break
  fi
done

有关详细信息,请参阅联机帮助页 date(1)

一行——希望是正确的

d=$(date -d date +%Y%m"01" +%u);date -d date +%Y%m"0"$(((9-$d)%7))

变量 d 包含星期几 (1..7),其中 1 是星期一 然后我打印当前年份和月份,用 $((9-$d))

更改日期

一个班轮:

d=$(date -d "today 1300" '+%Y%m01'); w=$(date -d $d '+%w'); i=$(( (8 - $w) % 7)); answer=$(( $d + $i ));

结果存储在$answer中。它使用工作变量 $d$w$i.

证明(假设你只是 运行 上面的一行):

echo $answer; echo $(date -d $answer '+%w')

预期结果:YYYYMMDD 中的当月星期一。在下一行,1 代表星期几。

扩展证明(检查接下来 100 个月的星期一):

for x in {1..100}; do d=$(date -d "+$x months 1300" '+%Y%m01'); w=$(date -d $d '+%w'); i=$(( (8 - $w) % 7)); answer=$(( $d + $i )); echo $answer; echo $(date -d $answer '+%w'); done | egrep -B1 '^[^1]$'

预期结果:无

(如果有结果,就是坏了)

分解

第一个语句获取当前月份的第一天,并将其存储在 $d 中,格式为 YYYYMMDD。

第二个语句获取日期 $d 的星期几,并将其存储在 $w.

第三个语句计算要添加的天数增量并将其存储在$i 中。零在这里完全有效,因为...

最后一条语句计算日期 $d(作为整数)和增量 $i(作为整数)的总和。这是有效的,因为 $i 的域是 0 到 6,我们总是从每个月的第一天开始。这可以快速转换回日期变量(有关此示例,请参见证明)。

这已经在 BASH v4.1 (CentOS 6)、v4.4 (Ubuntu) 和 v5 (Archlinux)

上进行了测试