在 Unix 中,我想查找给定月份和年份的最后一个星期六的日期(月份中的某天)。我知道cal
会给我一个给定月份/年份的日历。什么是获得最后一个星期六的好方法?
更新:我想要一个可以应用于一周中任何一天的解决方案。例如,我也可以使用相同的方法来查找上周日或周三的日期。
为此使用 awk。考虑一下:
cal 5 2013 | awk 'NF>6{a=$7} END{print a}'
25
如果您不想只是管道/解析cal
输出,则可以使用算法来确定 date 的 weekday,然后获取 12 月 31st 的工作日并向后移动使其成为星期六所需的天数。
但是解析 cal 可能更简单。
对于这个问题,我有另一个答案,这是一个有点冗长的 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 天是我们必须考虑的最早日期,因为在最短的一个月中(非闰年的二月),这是最后一次出现的最早日期,例如星期六。