質問のとおりです。 20120203から20120115を差し引いて、答えとして19を取得します。これをシェルスクリプトに実装する最良の方法は何ですか?
let DIFF=(`date +%s -d 20120203`-`date +%s -d 20120115`)/86400
echo $DIFF
スクリプトで使用できる迅速かつ完全にダーティな修正(迅速かつ高速):
この関数gendates
は、2つの日付の間の有効な日付のリストをYYYYmmdd形式(最も古いものから)で生成します。
function gendates { for dd in $(seq -w $1 $2) ; do date -d $dd +%Y%m%d 2>/dev/null ; done ; }
チェックするログファイル名のリストの生成など、ログファイルに関連するいくつかの目的でこの関数を使用します[1]。そして、日数の違いも数えるのに便利です:
echo "$(gendates YYYYmmdd YYYYmmdd)" | wc -l
もちろん、YYYYmmddは日付でなければなりません。これは、$ 1が$ 2より前の日付であり、日付の差が大きい場合は遅くなりますが、数年間はアドホックスクリプトで使用するのに非常に便利です。
そして、あなたがたまたまMySQlまたは類似のものをインストールしているなら、非常に速いオプションがあります:
mysql -BNe "SELECT DATEDIFF($1,$2) AS DiffDate ;" | tr -d -
最後のtr
を使用すると、任意の順序で日付を入力できます(MySQLは、最初の日付が2番目の日付より前の場合、「-」をレンダリングします)
[1]日付のリストを生成する理由は、YYYYmmdd.log.gzという形式のログファイルの名前を生成できるためです。アスタリスクまたは$(ls )、ただし、これは文字列を含むリストを提供するよりもはるかに遅くなります。
私がこれを解決した方法は次のとおりです(これに最終的にいくつかの便利なものが含まれることを願っています)
current="$(date +%s.%N)" #current date precise to ns
old="$(date +%s.%N -d "$(sh some_script_that_gives_a_date.sh)")" #convert to seconds too
diff=$(echo "$current-$olc" |bc)
date +%s.%N -d $1
は任意の日付を取り、それを指定された形式に変換します。
date $2 -d @0$diff #Pad diff with leading zero
$ 2は日付形式です https://www.tutorialkart.com/bash-Shell-scripting/bash-date-format-options-examples/ を参照してください