我正在寻找一个直接的 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
Run Code Online (Sandbox Code Playgroud)我需要这些日期来发送电子邮件组的通知。
例如:我可以得到下个月的第一个星期六,如下所示。
$ firstofmonth=$(date -d '+1 months' '+%Y%m01')
20170401
$ firstsaturday=$(date -d "$firstofmonth" '+%Y-%m')-$((7 - \
$(date -d "$firstofmonth" '+%u') ))
2017-04-1
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 12
在ksh93
:
$ printf '%(%F)T\n' 'next month, first Monday'
2017-04-03
Run Code Online (Sandbox Code Playgroud)
bash
,因为 4.2 现在%(<format>)T
在其printf
buitin 中支持 a ,但不支持解析这种日期表达式。
如果您必须使用bash
并想使用它%(<format>)T
,您仍然可以在不使用以下内容的情况下进行分叉:
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"
Run Code Online (Sandbox Code Playgroud)
par*_*ark 10
假设 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
Run Code Online (Sandbox Code Playgroud)
将 替换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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3965 次 |
最近记录: |