使用 \`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

我想输出应该是 9 , 10 , 11

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

原文由 greeness 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

问题是 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!

原文由 TomH 发布,翻译遵循 CC BY-SA 3.0 许可协议

以下将做:

 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"

查看完整结果

原文由 guest 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题