it-swarm.com.de

Verwenden Sie den Befehl `date`, um den vorherigen, aktuellen und nächsten Monat abzurufen

Ich benutze unten, um vorherige, aktuelle und den nächsten Monat unter Ubuntu 11.04 zu erhalten:

LAST_MONTH=`date +'%m' -d 'last month'`
NEXT_MONTH=`date +'%m' -d 'next month'`
THIS_MONTH=`date +'%m' -d 'now'`

Es funktioniert gut bis heute, dem letzten Tag im Oktober 2012 (2012-10-31)

Ich erhalte ab sofort folgendes Ergebnis:

$ 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

Ich nehme an, die Ausgaben sollten 9, 10 Bzw. 11 Sein.

Verstehe nicht, warum sich date Ausgaben so verhalten. Was sollte ein guter Weg sein, um stattdessen einen konsistenten previous, current und next Monat zu erhalten?

48
greeness

Das Problem ist, dass date Ihre Anfrage wörtlich nimmt und versucht, ein Datum vom 31. September (31. Oktober minus ein Monat) zu verwenden, und dann, weil es das nicht gibt, zum nächsten Tag übergeht, was der Fall ist. Die date Dokumentation (von info date) hat folgenden Rat:

Die Unschärfe in Einheiten kann zu Problemen mit relativen Gegenständen führen. Zum Beispiel kann 2003-07-31 -1 month als 2003-07-01 ausgewertet werden, da 2003-06-31 ein ungültiges Datum ist. Um den Vormonat zuverlässiger zu bestimmen, können Sie den Monat vor dem 15. des aktuellen Monats anfordern. Beispielsweise:

 $ 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!
97
TomH

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 eines jeden Monats berechnen. Auf diese Weise haben Sie keine Probleme mit Monaten, die am 30./31. Oder 28./29. (Schaltjahr Februar/Februar) enden.

8
estebanfallasf

folgendes wird ausreichen:

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 wie Sie brauchen:

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`

du hast nach einer Ausgabe wie 9,10,11 gefragt, also habe ich das %-m

%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

probier's einfach

date -d "$(date +%Y-%m-1) -13 month"

um das vollständige Ergebnis zu sehen

4
guest

das Hauptproblem tritt auf, wenn Sie nicht über die Option Datum - Datum verfügen und nicht über die Berechtigung zur Installation verfügen. Versuchen Sie anschließend Folgendes:

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
2
VIPIN KUMAR