Das Hauptproblem tritt auf, wenn Sie die date --date Option nicht verfügbar haben und Sie keine Berechtigung haben, sie zu installieren, dann versuchen Sie es unten -
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
Das Problem ist, dass date
nimmt Ihre Anfrage ganz wörtlich und versucht, ein Datum vom 31. September (das ist der 31. Oktober minus einem Monat) zu verwenden, und dann, weil das nicht existiert, verschiebt es sich auf den nächsten Tag, der es tut. Die date
Dokumentation (ab info date
) hat folgenden Ratschlag:
Die Unschärfe in Einheiten kann Probleme mit relativen Elementen verursachen. Beispielsweise könnte `2003-07-31 -1 Monat' zu 2003-07-01 ausgewertet werden, weil 2003-06-31 ein ungültiges Datum ist. Um den Vormonat zuverlässiger zu bestimmen, können Sie den Monat vor dem 15. des laufenden Monats erfragen. Zum Beispiel:
$ 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!
Wenn Sie Datum in einer MacOS-Umgebung verwenden, versuchen Sie Folgendes:
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
Außerdem würde ich den vorherigen und nächsten Monat lieber am ersten Tag jedes Monats berechnen, damit Sie keine Probleme mit Monaten haben, die am 30./31. oder 28./29. (Schaltjahr Februar/Februar) enden
Folgendes wird tun:
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
oder nach Bedarf:
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`
Sie haben nach einer Ausgabe wie 9,10,11 gefragt, also habe ich den %-m
verwendet
%m
(ohne -) erzeugt eine Ausgabe wie 09,... (führende Null)
dies funktioniert auch für mehr/weniger als 12 Monate:
date -d "$(date +%Y-%m-1) -13 month" +%-m
Probieren Sie es einfach aus
date -d "$(date +%Y-%m-1) -13 month"
um das vollständige Ergebnis zu sehen