web-dev-qa-db-ja.com

Linuxでの2つの日付の違い

次の形式で日付を取得しています

    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ですが、ゼロである必要があります。

丸一日の日付の違いを取得するにはどうすればよいですか?

1
VRVigneshwara

YYYYMMDD形式で記述された2つの日付を減算することはできません。たとえば、20150907 - 20140907は明らかに365ではなく10000を生成します。

20150907 - 20150907は0を生成します—減算を計算する代わりに直接等式をテストできることを除いて、等式をテストする有効な方法です。 -20150907を取得している場合、それはコードが表示したものではなく、v_sysdateに余分な文字(空白と数字以外)が含まれているためです。

日付を操作する正しい方法は、日付を単純な数値形式に変換することです。固定された原点からの時間単位の数( Epoch )。 nixの世界 では、標準の単位は秒(SIのように)であり、エポックは1970-01-01です。

datestatなどの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時間しか続きません)。