web-dev-qa-db-fra.com

Utiliser la commande `date` pour obtenir le mois précédent, en cours et suivant

J'utilise ci-dessous pour obtenir le mois précédent, en cours et le mois suivant sous Ubuntu 11.04:

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

Cela fonctionne bien jusqu'à aujourd'hui, le dernier jour d'octobre 2012 (2012-10-31)

Je reçois ci-dessous résultat à partir de maintenant:

$ 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

Je suppose que les sorties devraient être 9, 10, 11 respectivement.

Je ne comprends pas pourquoi les sorties de date se comportent comme ceci. Quel devrait être un bon moyen d’être cohérent à la place de previous, current et next mois?

48
greeness

Le problème est que date prend votre demande au sens littéral et essaie d'utiliser une date du 31 septembre (soit le 31 octobre moins un mois), puis, parce que cela n'existe pas, il passe au jour suivant. La documentation date (de info date) a les conseils suivants:

Le fuzz dans les unités peut causer des problèmes avec les objets relatifs. Par exemple, "2003-07-31 -1 month" peut correspondre à 2003-07-01, car 2003-06-31 est une date non valide. Pour déterminer le mois précédent de manière plus fiable, vous pouvez demander le mois avant le 15 du mois en cours. Par exemple:

 $ 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

Si vous utilisez la date dans un environnement MacOS, essayez ceci:

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

Aussi, je préférerais calculer le mois précédent et le mois suivant le premier jour de chaque mois. Ainsi, vous ne rencontrerez aucun problème avec les mois se terminant le 30/31 ou le 28/29 (année bissextile février/février).

8
estebanfallasf

ce qui suit fera:

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

ou selon vos besoins:

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`

vous avez demandé une sortie comme 9,10,11, alors j'ai utilisé le %-m

%m (sans -) produira une sortie comme 09, ... (zéro non significatif)

cela fonctionne également pour plus/moins de 12 mois:

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

juste essayer

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

pour voir le résultat complet

4
guest

le principal problème survient lorsque vous n'avez pas l'option date --date disponible et que vous n'avez pas l'autorisation de l'installer, puis essayez ci-dessous -

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