Ubuntu
11.04の下で、前月、現在月、および翌月を取得するために以下を使用しています。
LAST_MONTH=`date +'%m' -d 'last month'`
NEXT_MONTH=`date +'%m' -d 'next month'`
THIS_MONTH=`date +'%m' -d 'now'`
2012年10月の最終日(2012-10-31)までは正常に機能します
私は今の結果以下になります:
$ 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
出力はそれぞれ9
、10
、11
でなければなりません。
date
出力がこのように動作する理由を理解しないでください。代わりにprevious
、current
、およびnext
月を一貫性のあるものにする良い方法は何でしょうか?
問題は、date
がリクエストを文字通り受け取り、9月31日(10月31日から1か月を引いた日付)の日付を使用しようとすることです。 date
ドキュメント(info date
から)には次のアドバイスがあります:
単位のファズは、相対的なアイテムに問題を引き起こす可能性があります。たとえば、2003-06-31は無効な日付であるため、「2003-07-31 -1か月」は2003-07-01と評価されます。前月をより確実に決定するために、現在の月の15日より前の月を要求できます。例えば:
$ 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!
MacOS環境で日付を使用している場合は、これを試してください。
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
また、各月の初日に前月と翌月を計算するので、30/31または28/29(2月/ 2月のうるう年)で終わる月で問題が発生することはありません。
次のようにします:
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
または必要に応じて:
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`
9,10,11のような出力を要求したので、%-m
を使用しました
%m
(-なし)は、09、...(先行ゼロ)のような出力を生成します
これは、12か月以上/ 12か月未満でも機能します。
date -d "$(date +%Y-%m-1) -13 month" +%-m
ちょうど試して
date -d "$(date +%Y-%m-1) -13 month"
完全な結果を見る
主な問題は、日付--dateオプションがなく、インストールする権限がない場合に発生し、以下を試してください-
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