我想使用shell脚本获取当前和下几个月,我尝试过这个命令:
$ date '+%b'
mar
$ date +"%B %Y" --date="$(date +%Y-%m-15) next month"
March 2018
但它始终只显示当月。
如果命令有问题,请帮助我。
答案 0 :(得分:4)
$ date -d "next month" '+%B %Y'
April 2018
检查this post有关具体警告的信息
注意:你的命令对我来说很好(archlinux,bash4,日期GNU coreutils 8.29)
答案 1 :(得分:1)
我不会单靠date
来做这件事。相反,在月份数上执行一些基本的数学运算。
this_month=$(date +%-m) # GNU extension to avoid leading 0
next_month=$(( this_month % 12 + 1 ))
next_month_name=$(date +%B --date "2018-$next_month-1")
由于您使用的是bash
,因此您根本不需要使用date
来获取当前月份;内置的printf
可以调用基础日期/时间例程,从而节省了一个分支。
$ printf -v this_month '%(%-m)T\n'
$ echo $this_month
3
答案 2 :(得分:0)
您运行的date
的变体和版本是什么?虽然SunOS 5.2是Solaris 2.2中的内核(1999年的EOL),但“Solaris 5.2”从未发布过。请参阅Solaris OS version history。 Solaris 10(SunOS 5.10)man page for date不支持问题中使用的GNU --date=
语法,所以我猜你正在使用某些版本的date from GNU coreutils。
这是使用BSD date
的解决方案(请注意,这是BSD date -v 1m
面对的学术问题):
date -jf %s $((1728000+$(date -jf %Y-%m-%d $(date +%Y-%m-15) +%s))) +"%B %Y"
此处有三个日期调用。 BSD的日期允许指定格式(GNU可以直接使用大多数格式)。父呼叫是最后一次(自1970年代以来的秒数),以期望的“月年”格式表达。通过在第15天的当月的纪元时间添加20天来确定秒数。由于没有一个月有15 + 20天,所以总是在下个月。
这是将该逻辑直接翻译为GNU日期:
date +"%B %Y" --date="@$((1728000+$(date +%s --date=$(date +%Y-%m-15))))"
这是一个使用GNU日期的简单解决方案,只需少一个date
调用:
date +"%B %Y" --date="$(date +%Y-%m-15) 20 days"
(如果您在31日运行date --date="next month"
,则GNU日期中的bug会给您错误的月份。)
答案 3 :(得分:0)
以下代码在Red Hat 4.4.7-23(Linux版本2.6.32-754.2.1.el6.x86_64)中有效。 只需在以后的月份中使用“月”,在前几个月中使用“月前”即可。不要混淆在数字上加上+/-号。结帐。
> date "+%B-%Y" #current month
November-2018
> date -d" 1 month" "+%B-%Y"
December-2018
> date -d" 1 month ago" "+%B-%Y"
October-2018
>
更多..
> date -d" 7 month ago" "+%B-%Y"
April-2018
> date -d" 7 month " "+%B-%Y"
June-2019
>