le problème principal se produit lorsque vous n'avez pas l'option date --date disponible et que vous n'avez pas la permission de l'installer, alors 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
Le problème est que date
prend votre demande littéralement 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 qui existe. Le date
documentation (à partir de info date
) a le conseil suivant :
Le flou dans les unités peut causer des problèmes avec des éléments relatifs. Par exemple, `2003-07-31 -1 month' peut être évalué à 2003-07-01, car 2003-06-31 est une date invalide. Pour déterminer le mois précédent de manière plus fiable, vous pouvez demander le mois précédant 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!
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
De plus, je préfère calculer le mois précédent et le mois suivant le premier jour de chaque mois, de cette façon vous n'aurez pas de problèmes avec les mois se terminant le 30/31 ou le 28/29 (fév/fév année bissextile)
ce qui suit fera l'affaire :
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, j'ai donc utilisé le %-m
%m
(sans -) produira une sortie comme 09,... (zéro non significatif)
cela fonctionne aussi pendant plus/moins de 12 mois :
date -d "$(date +%Y-%m-1) -13 month" +%-m
essayez juste
date -d "$(date +%Y-%m-1) -13 month"
pour voir le résultat complet