次の形式で日付を取得しています
v_date=$(date +"%Y%m%d" -d "1970-01-01 + $(stat -c '%Z' file ) secs")
v_sysdate=$(date +%Y%m%d)
echo "$v_date"
20150907
echo "$v_sysdate"
20150907
v_date_difference=$((${v_sysdate}-${v_date}))
echo "$v_date_difference"
返される値は-20150907ですが、ゼロである必要があります。
丸一日の日付の違いを取得するにはどうすればよいですか?
YYYYMMDD形式で記述された2つの日付を減算することはできません。たとえば、20150907 - 20140907
は明らかに365ではなく10000を生成します。
20150907 - 20150907
は0を生成します—減算を計算する代わりに直接等式をテストできることを除いて、等式をテストする有効な方法です。 -20150907
を取得している場合、それはコードが表示したものではなく、v_sysdate
に余分な文字(空白と数字以外)が含まれているためです。
日付を操作する正しい方法は、日付を単純な数値形式に変換することです。固定された原点からの時間単位の数( Epoch )。 nixの世界 では、標準の単位は秒(SIのように)であり、エポックは1970-01-01です。
date
やstat
などのGNUユーティリティは、エポックからの日付を%s
形式で秒単位で出力します。きれいに印刷する必要があるまで、この形式を使用してください。この形式でdate
の日付を渡すには、秒数の前に@
を入力します。
v_date=$(stat -c '%Z' file)
v_sysdate=$(date +%s)
v_date_difference=$((v_sysdate-v_date))
date -d "@$v_date" +'File ctime: %Y%M%D'
date -d "@$v_sysdate" +'Current time: %Y%M%D'
echo "$v_date_difference seconds elapsed"
echo "$((v_date_difference / 86400)) days elapsed"
これは、2つの時間の間の日数を計算することに注意してください。たとえば、昨日の23:59と今日の00:01の間では、これは0日の差を示しています。時刻を無視して2つの日付の差が必要な場合は、その日の参照時刻を使用できます。
file_midday_time=$(date +%s -d "$(date '+%Y-%m-%d 12:00' -d "@$(stat -c %Z file)")")
current_midday_time=$(date +%s -d "today 12:00")
day_difference=$(((file_midday_time - current_midday_time + 7200) / 86400))
3601から86399までの数値を追加すると、時計が通常の時間から夏時間に切り替わる日でも1日が考慮されます(その日は23時間しか続きません)。