我怎么能在下个月获得贝壳?

时间:2018-03-20 14:57:31

标签: linux bash shell date

我想使用shell脚本获取当前和下几个月,我尝试过这个命令:

$ date '+%b'

mar

$ date +"%B %Y" --date="$(date +%Y-%m-15) next month"

March 2018

但它始终只显示当月。

如果命令有问题,请帮助我。

4 个答案:

答案 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
>