シェルスクリプトで先月の最終日の日付を取得する


11

処理日に基づいて、前月の終了日を取得するにはどうすればよいですか?

例:

  • 処理日= 2015年1月15日
  • 予定日= 31dec2014、

  • 処理日= 2015年2月10日
  • 予定日= 2015年1月31日

回答:


27

GNUの場合date

$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015

一部のシェルには日付操作のサポートが組み込まれています。

ksh93

$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015

zsh

$ zmodload zsh/datetime
$ strftime -s d %Y-%m-01-12 $EPOCHSECONDS
$ strftime -rs d %Y-%m-%d-%H $d
$ strftime %d%b%Y $((d-86400))
31Jul2015

4

これを行う方法はたくさんありますここに私が見つけた最も単純なものがあります(ここではGNUを想定していますdate):

$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015

1
@stephaneの答えはより明確で、これは奇妙な年には機能しません。月の途中でスキップ/追加された日があります。はい、これは起こりました。youtube.com/watch?v=-5wpm-gesOYを
ctrl-alt-delor

@richard、GNU日の道の日(オフセット仕事は(オフセット1日は24時間営業のものと同じではありません)、私はこの答えを考えると私は同等であるとのみ1月の最後の日をスキップしますタイムゾーンで失敗します通常、これが発生した場合、-12:00オフセットから12:00オフセット(または-13から11 ...)への切り替えのためにおそらく太平洋の島にあるでしょう。
StéphaneChazelas

@Stephane他の問題を指摘してくれてありがとう、時間は難しいです。ソリューションで、月の途中が削除された(これが発生した)場合、30日目は30日目ではないため、30を減算しても前月の最終日にはなりません。月の最初の日がある場合、これが機能しない理由がわかりません(保証されません)。しかし、これはそうなるという意味ではありません。
ctrl-alt-delor

@richard、参照してくださいTZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '1 day ago'。2011-12-30がないため、エラーが発生します。つまり、日のオフセットはカレンダー時間で行われました。2011-12-31-31日は、2011年11月30日で31オフ31になります。現在の時刻から31 * 24 * 60 * 60 * 60秒はかかりません。TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'どちらがあなたに29番目、つまり今回は24 * 60 * 60 * 60秒前の日付を与えるかと比較してください。
ステファンChazelas

2

これは、BSD dateユーティリティを使用するMac OSで動作するバージョンです。

date -v1d -v-1d +%d%b%Y

引数は順番に適用されます。ある日付から次の引数に日付がパイプで送られることを想像できます。例えば:

  • 現在の日付で開始(date)-> 2017-03-06
  • その日付をその月の最初の日に設定します(-v1d)-> 2017-03-01
  • その日を-v-1d)引いてください(-> 2017-02-28
  • 日付のフォーマット(+%d%b%Y)-> 2017年2月28 日

を使用してdate -v-1m -v1d -v-1d、任意-1mの月数を前後に移動+1mできます。代わりに、必要な月数を前後に移動します()。

それが一般的な答えです。この質問では、具体的に開始日を基準にした日付について尋ねます。Mac OS / BSDの日付ユーティリティでは、開始する日付スタンプを指定できませんが、各日付要素を個別に設定できます。

date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y -> 2014年12月31日


0

このコードを使用してみてください

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

これで今月の最終日になります。
Warren Young
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.