yyyymmddhhmmss形式で日付と時刻を減算する

yyyymmddhhmmss形式で日付と時刻を減算する

yyyymmddhhmmssシェル変数には2つの形式の日付/時刻値があります。
私は1つを別のものから減算し、次のように数秒で結果を得たいと思います。

a=20170804020000
b=20170804015959
c=a-b

私が望む結果はc=102:00:00より1秒遅いので01:59:59)ですが、結果はですc=4041

秒単位で結果を取得するには、日付/時刻値をどのように減算できますか?

答え1

まず、日付をunix time_t形式(つまり、「epoch」1970-01-01 00:00:00以降の秒数)に変換する必要があります。その後、単純なマイナスで差を計算できます。

プログラムはdate現在の形式の日付を理解できません。数字ではなく、ダッシュとコロンで区切られたフィールドがある日付に似ていることを期待します。

sed以下は、関数で「固定」日付を使用する例です。つまり、理解できる形式に変換してdateからdatetime_t 秒に変換を使用して減算するということです。

#!/bin/bash

a=20170804020000
b=20170804015959

function fixdate() {
  printf "$1" | sed -E -e 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/'
}

a_seconds="$(date -d "$(fixdate "$a")" '+%s')"
b_seconds="$(date -d "$(fixdate "$b")" '+%s')"
seconds=$((a_seconds - b_seconds))

echo "$seconds"

答え2

きれいではありませんが、Centosではこれが機能します。

a=20170804020000

b=20170804015959

ayear=${a:0:4}
amonth=${a:4:2}
aday=${a:6:2}
ahour=${a:8:2}
amin=${a:10:2}
asec=${a:12:2}

byear=${b:0:4}
bmonth=${b:4:2}
bday=${b:6:2}
bhour=${b:8:2}
bmin=${b:10:2}
bsec=${b:12:2}

adate=$(date -d "$amonth/$aday/$ayear $ahour:$amin:$asec" +"%s")
bdate=$(date -d "$bmonth/$bday/$byear $bhour:$bmin:$bsec" +"%s")
datediff=$((adate-bdate))

答え3

日付をUnix形式に変換して数学演算を実行できます。ただし、これを行うには、まずこれらの値(yyyymmddhhmmss)に適切な形式(yyyy-mm-dd hh:mm:ss)を指定する必要があります。

これにより、次のことができます。

$ a=$(date -d '2017-08-04 02:00:00' '+%s')
$ b=$(date -d '2017-08-04 01:59:59' '+%s')
$ c=$((a-b))
$ echo $a
1501830000
$ echo $b
1501829999
$ echo $c
1

関連情報