GNU/Linux >> Linux の 問題 >  >> Linux

`date` コマンドを使用して前月、当月、翌月を取得する

主な問題は、date --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

問題は date はあなたのリクエストを文字通り受け取り、9 月 31 日の日付 (10 月 31 日から 1 か月を引いたもの) を使用しようとしますが、それが存在しないため、存在する翌日に移動します。 date ドキュメント (info date から) ) には次のアドバイスがあります:

<ブロック引用>

単位のあいまいさは、相対アイテムで問題を引き起こす可能性があります。たとえば、2003-06-31 は無効な日付であるため、「2003-07-31 -1 month」は 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

また、各月の 1 日に前月と翌月を計算することをお勧めします。これにより、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 か月以上/未満で機能します:

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

試してみてください

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

完全な結果を見る


Linux
  1. bash履歴を使用して前のコマンドを取得し、それをコピーしてから「実行」しますが、コマンドはコメント化されています

  2. 現在の時刻を時と分で取得する

  3. Bash - 日付コマンドとスペース

  1. コマンドラインを使用して相対時間を設定する

  2. 日付に X 日を追加して新しい日付を取得するにはどうすればよいですか?

  3. 曜日に関係なく前月を取得

  1. timedatectlコマンドを使用してRHEL7Linuxシステムの日時を変更する

  2. CentOS / RHEL :history コマンド出力で実行されたコマンドの日時を取得する方法

  3. Linuxは、指定された日時に現在の(または他の)タイムゾーンからUTCオフセットを取得します