如何使用 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)
上进行了测试
我需要使用 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)
上进行了测试