処理日に基づいて、前月の終了日を取得するにはどうすればよいですか?
例:
- 処理日= 2015年1月15日
- 予定日= 31dec2014、
- 処理日= 2015年2月10日
- 予定日= 2015年1月31日
処理日に基づいて、前月の終了日を取得するにはどうすればよいですか?
例:
回答:
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
これを行う方法はたくさんあります。ここに私が見つけた最も単純なものがあります(ここではGNUを想定していますdate
):
$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015
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秒前の日付を与えるかと比較してください。
これは、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日