1

YYYYmmDDHHMMSS のような 2 時間の時差を見つけることができる Unix スクリプトが必要です

T1=20120624192555

T2=20120624204006

したがって、時差は =1:14:11 になります。

どんな手掛かり?

4

3 に答える 3

1

日付形式の指定を回避できるかどうかはわかりませんが、かなり長いdate解決策を次に示します。

# Get seconds since epoch
D1=$(date --date "${T1:0:4}-${T1:4:2}-${T1:6:2} ${T1:8:2}:${T1:10:2}: ${T1:12:2}" +%s)
D2=$(date --date "${T2:0:4}-${T2:4:2}-${T2:6:2} ${T2:8:2}:${T2:10:2}: ${T2:12:2}" +%s)

date --date "0 + $(( D2 - D1 )) seconds" +%T

${VAR:OFF:LEN} リファレンスについては、こちらを参照してください。

注:以下のjrouquieが述べているように、これは 24 時間を超えると失敗します。これはdateコマンドの制限ですが、 $(( D2 - D1 )) でも数秒で正しい結果が得られます。

于 2012-06-27T15:55:18.807 に答える
0

これは、Thor/kjpと私のものを最大限に活用したソリューションです。

#!/bin/bash
function seconds_since_epoch() {
    echo $(date --utc --date "${1:0:4}-${1:4:2}-${1:6:2}
                              ${1:8:2}:${1:10:2}:${1:12:2}" +%s)
}
difference=$(( `seconds_since_epoch $2` - `seconds_since_epoch $1` ))
echo \
`expr $difference / 3600`:\
`expr "(" $difference / 60 ")" % 60`:\
`expr $difference % 60`
于 2012-06-27T19:00:41.790 に答える
0
time1=`echo $1 | sed -r 's/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/\1-\2-\3 \4:\5:\6/'`
time2=`echo $2 | sed -r 's/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/\1-\2-\3 \4:\5:\6/'`

seconds1=`date --utc -d "$time1" +%s`
seconds2=`date --utc -d "$time2" +%s`
difference=`expr $seconds2 - $seconds1`

echo `expr $difference / 3600`:`expr "(" $difference / 60 ")" % 60`:`expr $difference % 60`

--utcwhich を使用すると、夏時間のバグが防止されることに注意してください。

警告:

このスクリプトは入力をチェックしません。

$2 > $1 を想定しています。

繰り返しコードを因数分解するように書き直すことができます

編集: 最初のコメントに関して、sed の「-r」オプションを使用しないバージョンを次に示します (-r は --regexp-extended を意味し、ここではすべてのバックスラッシュを省くことができます)。

time1=`echo $1 | sed 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1-\2-\3 \4:\5:\6/'`
time2=`echo $2 | sed 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1-\2-\3 \4:\5:\6/'`

seconds1=`date --utc -d "$time1" +%s`
seconds2=`date --utc -d "$time2" +%s`
difference=`expr $seconds2 - $seconds1`

echo `expr $difference / 3600`:`expr "(" $difference / 60 ")" % 60`:`expr $difference % 60`
于 2012-06-27T15:52:54.277 に答える