日数に関係なく、前月を取得します。

日数に関係なく、前月を取得します。

Linuxでは、次のコマンドを使用して先月の情報を取得できます。

date -d "last month" '+%Y%m'

または

date -d "1 month ago" '+%Y%m'

ところで、今日が3月31日だと仮定し、上部にコマンドを実行すると201603と出てきますが、今がどんな曜日でも先月の情報を取得したいのですが、どうすればいいですか?

先月の最初の日/最後の日を取得するなどの回避策を使用してこれを達成できますが、それを実行するためのエレガントな方法があるかどうか疑問に思います。

 date -d "-$(date +%d) days" '+%Y%m'     #get last day of previous month

答え1

通常、毎月15日を使用します。それから1ヶ月を引いてください。

$ nowmonth=$(date +%Y-%m)
$ date -d "$nowmonth-15 last month" '+%Y%m'
201602

答え2

GNU dateあなたが思うように、算術に特に適していません。それが私が書いた理由の一つです。dateutils

あなたの例は次のように要約されます。

$ dateadd today -1mo -f '%Y%m'
201603

そして3月31日に正しいことをしました:

$ dateadd 2016-03-31 -1mo -f '%Y%m'
201602

または、今日の日付に関係なく、あなたの意見が意味するもの(前月の最後の日を取得する)は次のとおりです。

$ dateround --next today -31d
2016-03-31
$ dateround --next 2016-03-31 -31d
2016-02-29

答え3

私のアプローチは、日付算術を適用する前に常に既知の信頼できる日付を使用することです。この場合、その月の最初の日を取得し、ある日に戻ります。

date --date "$(date +%Y-%m-01) -1 day"

一部のタイムゾーンでは、月の境界でうるう秒(UTC 23:59以降61秒)実行すると中断されることがあります。私たちは1999年12月31日に1つを持っていましたが、最新のものも1ヶ月以内であることを確認しませんでした。

答え4

私は数年前に同じ質問を受け、「1ヶ月前」が実際に何をしているのかについてかなり良い答えを得ました。

@riciの答えいくつかの引用

  • 1ヶ月は、月番号から1を引いた後、結果の日付が無効な場合(たとえば2月30日)、それを調整して有効にします。したがって、12月31日〜最初の月は11月の1日ではなく12月1日になり、3月31日〜最初の月は3月3日になります(うるう年の場合を除く)。

詳しくは下記をご覧ください回答

関連情報