使用`date`命令获取上一个,当前和下个月

时间:2012-10-31 22:39:00

标签: linux bash unix date

我在下面用Ubuntu 11.04获取上一个,当前和下个月:

LAST_MONTH=`date +'%m' -d 'last month'`
NEXT_MONTH=`date +'%m' -d 'next month'`
THIS_MONTH=`date +'%m' -d 'now'`

直到今天,即2012年10月的最后一天(2012-10-31)

截至目前我的结果如下:

$ date
Wed Oct 31 15:35:26 PDT 2012
$ date +'%m' -d 'last month'
10
$ date +'%m' -d 'now'
10
$ $ date +'%m' -d 'next month'
12

我认为输出应分别为91011

不明白为什么date输出表现得像这样。什么应该是获得一致的previouscurrentnext月的好方法?

5 个答案:

答案 0 :(得分:91)

问题在于date完全接受你的请求并尝试使用9月31日(10月31日减去一个月)的日期,然后因为那不存在它会移动到第二天。 date文档(来自info date)有以下建议:

  

单位模糊可能会导致相关项目出现问题。对于   例如,“2003-07-31 -1月”可能会评估为2003-07-01,因为   2003-06-31是无效日期。确定前一个月更多   可靠的,您可以要求当前的15日之前的一个月   月。例如:

 $ date -R
 Thu, 31 Jul 2003 13:02:39 -0700
 $ date --date='-1 month' +'Last month was %B?'
 Last month was July?
 $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
 Last month was June!

答案 1 :(得分:7)

如果您恰好在MacOS环境中使用日期,请尝试以下操作:

ST1:~ ejf$ date
Mon Feb 20 21:55:48 CST 2017
ST1:~ ejf$ date -v-1m +%m
01
ST1:~ ejf$ date -v+1m +%m
03

另外,我宁愿计算每个月第一天的上个月和下个月,这样你就不会遇到30/31或28/29(2月/ 2月闰年)的月份问题< / p>

答案 2 :(得分:2)

如果您没有日期 - 日期选项并且您没有安装权限,则会出现主要问题,请尝试以下操作 -

Previous month
#cal -3|awk 'NR==1{print toupper(substr($1,1,3))"-"$2}'
DEC-2016 
Current month
#cal -3|awk 'NR==1{print toupper(substr($3,1,3))"-"$4}'
JAN-2017
Next month
#cal -3|awk 'NR==1{print toupper(substr($5,1,3))"-"$6}'
FEB-2017

答案 3 :(得分:2)

将执行以下操作:

date -d "$(date +%Y-%m-1) -1 month" +%-m
date -d "$(date +%Y-%m-1) 0 month" +%-m
date -d "$(date +%Y-%m-1) 1 month" +%-m

或根据需要:

LAST_MONTH=`date -d "$(date +%Y-%m-1) -1 month" +%-m`
NEXT_MONTH=`date -d "$(date +%Y-%m-1) 1 month" +%-m`
THIS_MONTH=`date -d "$(date +%Y-%m-1) 0 month" +%-m`

您要求输出9,10,11之类的内容,因此我使用了%-m

%m(不带-)将产生类似于09,...(前导零)的输出

这也可以使用超过12个月以下的时间:

date -d "$(date +%Y-%m-1) -13 month" +%-m

尝试

date -d "$(date +%Y-%m-1) -13 month"

查看完整结果

答案 4 :(得分:0)

问题仍然存在,我认为有一个错误:

$ date -d '20121212 -1 month'
Mon Nov 12 00:00:00 UTC 2012
$ date -d '20121231 -1 month'
Sat Dec  1 00:00:00 UTC 2012
date -d '20121231 last month'
Sat Dec  1 00:00:00 UTC 2012
date -d '20121231' +%-m
12