web-dev-qa-db-ja.com

「date」コマンドを使用して前月、現在月、来月を取得する

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

出力はそれぞれ91011でなければなりません。

date出力がこのように動作する理由を理解しないでください。代わりにpreviouscurrent、およびnext月を一貫性のあるものにする良い方法は何でしょうか?

48
greeness

問題は、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!
97
TomH

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月のうるう年)で終わる月で問題が発生することはありません。

8
estebanfallasf

次のようにします:

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"

完全な結果を見る

4
guest

主な問題は、日付--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
2
VIPIN KUMAR