67

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

我想输出应该分别是9, 。1011

不明白为什么date输出会这样。什么应该是获得一致和月份的previouscurrent方法next

4

5 回答 5

124

问题是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!
于 2012-10-31T22:56:19.647 回答
16

以下将做:

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"

查看完整结果

于 2018-10-31T12:08:12.817 回答
14

如果你碰巧在 MacOS 环境中使用 date,试试这个:

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(闰年)的月份的问题

于 2017-02-21T04:01:27.063 回答
3

当您没有可用的 date --date 选项并且您没有安装它的权限时,会出现主要问题,然后在下面尝试 -

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
于 2017-01-28T07:50:04.110 回答
0

前一个月:

date -d "1 month ago" +'%m'

这个月:

date +'%m'

下个月:

date -d "-1 month ago" +'%m'
于 2021-11-24T05:49:09.627 回答