我正在寻找一个直接的 Unix 命令来获取下个月的第一个星期日、下个月的第一个星期一、下个月的第一个星期二、下个月的第一个星期三等。
我需要它们的完整日期格式(时间不是强制性的)
我可以获得 2、3、4 等数字。因为我不仅仅想要数字,所以我需要日期格式的它们(包括日、月、年)
$ NEXT_MONTH=`date +'%m %Y' -d 'next month'` $ echo $NEXT_MONTH 04 2017 $ NEXT_SUNDAY=`cal $NEXT_MONTH | awk 'NF==7 && !/^Su/{print $1;exit}'` $ echo $NEXT_SUNDAY 2
我需要这些日期来发送电子邮件组的通知。
例如:我可以得到下个月的第一个星期六,如下所示。
$ firstofmonth=$(date -d '+1 months' '+%Y%m01')
20170401
$ firstsaturday=$(date -d "$firstofmonth" '+%Y-%m')-$((7 - \
$(date -d "$firstofmonth" '+%u') ))
2017-04-1
答案1
在ksh93
:
$ printf '%(%F)T\n' 'next month, first Monday'
2017-04-03
bash
%(<format>)T
,因为4.2现在在其buitin中支持a printf
,但不支持解析这种日期表达式的能力。
如果你必须使用bash
并且想要使用它%(<format>)T
,你仍然可以在不使用 fork 的情况下使用它,例如:
printf -v code '%(
t=$((%s + (12 - %-H) * 60 * 60))
increment=$((8 - %u))
current_month=%m)T' -1
eval "$code"
until
t=$((t + increment * 24 * 60 * 60)) # next Monday around mid-day
printf -v code '%(date=%F month=%m)T' "$t"
eval "$code"
[ "$month" != "$current_month" ] # until be get to next month
do
increment=7 # the first increment is the number of days
# til Monday. Next increments are just a week.
done
echo "$date"
答案2
假设 GNU date
(为此-d
你正在使用自己),以及一个zsh
类似于 shell 的{1..7}
:
$ for i in {1..7} ; do \
LC_ALL=C date '+%Y-%m-%d %a' -d "$(date +%Y%m0${i}) next month" ; \
done | awk '/Mon/ {print $1}'
2017-04-03
将 替换awk
Mon为所需的任何工作日(用于LC_ALL=C
获取英文月份名称,无论用户的区域设置如何)。另外,如果您要重新查询一周中的每一天,最好将其存储到变量中:
$ days=$(for i in {1..7} ; do \
LC_ALL=C date '+%Y-%m-%d %a' -d "$(date +%Y%m0${i}) next month" ; \
done)
$ for i in Mon Tue Wed Thu Fri Sat Sun ; do \
echo "${days}" | awk "/${i}/"'{print $1}' ; \
done
2017-04-03
2017-04-04
2017-04-05
2017-04-06
2017-04-07
2017-04-01
2017-04-02
答案3
实际上,如果您的系统上可用,PHP 可以非常轻松地通过文本输入解析日期。
例子:
bash-[522]$ php -qr 'date_default_timezone_set("UTC"); echo date("d-m-Y\n", strtotime("first monday of next month"));'
03-04-2017
我的 .bashrc 中有这个函数:
get_date ()
{
text="$*";
php -qr "date_default_timezone_set(\"UTC\"); echo date(\"d-m-Y\n\", strtotime(\"$text\"));"
}
我可以将其用作:
bash-[523]$ get_date first monday of next month
03-04-2017
编辑添加要使用的选项cal
几乎每个有的系统bash
都会有cal
。日历程序。您可以通过运行cal
、date
和的组合来获取每周第一天的日期列表awk
,如下所示:
cal -hN $(date -d 'next month' +%b' '%Y) | grep -v $(date -d 'next month' +%b) | awk -v date=$(date -d 'next month' +%Y-%m-) '{ printf "%s: "date"%02i\n", $1, $2; }'
这将为您提供以下输出:
Su: 2017-04-02
Mo: 2017-04-03
Tu: 2017-04-04
We: 2017-04-05
Th: 2017-04-06
Fr: 2017-04-07
Sa: 2017-04-01
更改awk 语句中$2
的$NF
来获取一个月中每一天最后一次出现的日期。
答案4
您可以仅列出下个月的所有日期和工作日:
# for i in `seq 1 93`; do date '+%Y-%m-%d %w' -d "+$((i - 31)) days"; done | sed 's|0$|7|g' | grep `date +"%Y-%m" --date="$(date +%Y-%m-15) 1 month"`
2021-02-01 1
2021-02-02 2
2021-02-03 3
2021-02-04 4
2021-02-05 5
2021-02-06 6
2021-02-07 7
2021-02-08 1
2021-02-09 2
2021-02-10 3
2021-02-11 4
2021-02-12 5
2021-02-13 6
2021-02-14 7
2021-02-15 1
2021-02-16 2
2021-02-17 3
2021-02-18 4
2021-02-19 5
2021-02-20 6
2021-02-21 7
2021-02-22 1
2021-02-23 2
2021-02-24 3
2021-02-25 4
2021-02-26 5
2021-02-27 6
2021-02-28 7
附加此内容以获取该月的第一个星期日:| grep 7$ | head -n 1
就是这样
题外话:获取该月的最后一个星期五:| grep 5$ | tail -n 1
题外话:这个月买点东西,1 month
改成0 month