hlavní problém nastává, když nemáte k dispozici volbu date --date a nemáte oprávnění ji nainstalovat, zkuste to níže -
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
Problém je v tom, že date
bere vaši žádost zcela doslovně a snaží se použít datum 31. září (je 31. října mínus jeden měsíc) a poté, protože neexistuje, přesune se na další den, což je. date
dokumentaci (od info date
) má následující radu:
Neostrost v jednotkách může způsobit problémy s relativními položkami. Například „2003-07-31 -1 month“ může být vyhodnocen jako 2003-07-01, protože 2003-06-31 je neplatné datum. Chcete-li spolehlivěji určit předchozí měsíc, můžete požádat o měsíc před 15. dnem aktuálního měsíce. Například:
$ 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!
Pokud náhodou používáte datum v prostředí MacOS, zkuste toto:
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
Také bych raději vypočítal předchozí a následující měsíc první den každého měsíce, takže nebudete mít problémy s měsíci končícími 30/31 nebo 28/29 (únor/únor přestupný rok)
provede se následující:
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
nebo jak potřebujete:
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`
požádali jste o výstup jako 9,10,11, tak jsem použil %-m
%m
(bez -) vytvoří výstup jako 09,... (počáteční nula)
to také funguje déle/méně než 12 měsíců:
date -d "$(date +%Y-%m-1) -13 month" +%-m
prostě zkuste
date -d "$(date +%Y-%m-1) -13 month"
zobrazíte úplný výsledek