yyyymmddhhmmss
シェル変数には2つの形式の日付/時刻値があります。
私は1つを別のものから減算し、次のように数秒で結果を得たいと思います。
a=20170804020000
b=20170804015959
c=a-b
私が望む結果はc=1
(02:00:00
より1秒遅いので01:59:59
)ですが、結果はですc=4041
。
秒単位で結果を取得するには、日付/時刻値をどのように減算できますか?
答え1
まず、日付をunix time_t形式(つまり、「epoch」1970-01-01 00:00:00以降の秒数)に変換する必要があります。その後、単純なマイナスで差を計算できます。
プログラムはdate
現在の形式の日付を理解できません。数字ではなく、ダッシュとコロンで区切られたフィールドがある日付に似ていることを期待します。
sed
以下は、関数で「固定」日付を使用する例です。つまり、理解できる形式に変換してdate
からdate
time_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