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

时间:2015-03-14 09:34:31

标签: bash cygwin

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

3 个答案:

答案 0 :(得分:1)

这应该这样做,但我这里没有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)

答案 1 :(得分:1)

单行 - 我希望这是正确的

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

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

更改日期

答案 2 :(得分:0)

一个班轮:

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)上进行了测试