2

在 Unix 中,我想查找给定月份和年份的最后一个星期六的日期(月份中的某天)。我知道cal会给我一个给定月份/年份的日历。什么是获得最后一个星期六的好方法?

更新:我想要一个可以应用于一周中任何一天的解决方案。例如,我也可以使用相同的方法来查找上周日或周三的日期。

4

3 回答 3

3

为此使用 awk。考虑一下:

cal 5 2013 | awk 'NF>6{a=$7} END{print a}'

输出:

25
于 2012-05-03T17:14:35.080 回答
0

如果您不想只是管道/解析cal输出,则可以使用算法来确定 date 的 weekday,然后获取 12 月 31st 的工作日并向后移动使其成为星期六所需的天数。

但是解析 cal 可能更简单。

于 2012-05-03T17:23:04.740 回答
0

对于这个问题,我有另一个答案,这是一个有点冗长的 Bash 脚本,效率不高,但易于理解。基本思想是循环给定月份和年份的第 22 天到第 31 天,并检查这些天中每一天的星期几date +'%u'。返回所需工作日的最后一天(例如星期六)存储在变量 中RESULT_DAY,该变量将包含循环后的结果。

#!/bin/bash

DAY_OF_WEEK=6 # 1=Monday, ..., 7=Sunday
THE_YEAR=2016
THE_MONTH=10


RESULT_DAY=0

YEAR_MONTH_STR=${THE_YEAR}"-"${THE_MONTH}  # Example value: "2016-10"

for DAYNO in 22 23 24 25 26 27 28 29 30 31
do
  DATE_TO_CHECK=${YEAR_MONTH_STR}"-"${DAYNO}
  DATE_RESULT=$(date --date=$DATE_TO_CHECK '+%u')
  if [ $? -eq 0 ]
  then
    if [ $DATE_RESULT -eq $DAY_OF_WEEK ]
    then
      RESULT_DAY=$DAYNO
    fi
  fi

done

RESULT_DATE_COMPLETE=${YEAR_MONTH_STR}"-"${RESULT_DAY}

echo -e "\nResult date (YYYY-MM-DD): "$(date --date=$RESULT_DATE_COMPLETE +'%Y-%m-%d (%A)')

我们通过检查值"0"date来检查 的结果代码,因此我们可以忽略非法日期(例如 2 月 31 日,它不存在)。$?

一个月的第 22 天是我们必须考虑的最早日期,因为在最短的一个月中(非闰年的二月),这是最后一次出现的最早日期,例如星期六。

于 2016-10-12T18:38:44.117 回答