Подтвердить что ты не робот

Используя команду `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 года (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 ведет себя так. Каким должен быть хороший способ получить согласованный previous, current и next месяц вместо этого?

4b9b3361

Ответ 1

Проблема заключается в том, что date берет ваш запрос буквально и пытается использовать дату 31 сентября (31 октября минус один месяц), а затем, потому что этого не существует, он переходит на следующий день. Документация date (от info date) имеет следующий совет:

Fuzz в единицах может вызвать проблемы с относительными элементами. Для пример, "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!

Ответ 2

Если вы используете дату в среде 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 (февраль-февральский високосный год)

Ответ 3

Основная проблема возникает, если у вас нет доступной даты dateddate, и у вас нет разрешения на ее установку, а затем попробуйте ниже -

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