14位数日期YYYYmmDDHHMMSS的时差

时间:2012-06-27 15:34:22

标签: unix

我需要一个Unix脚本,我可以找到2次之间的时差看起来像YYYYmmDDHHMMSS

实施例

T1 = 20120624192555

T2 = 20120624204006

所以时差将是= 1:14:11

有任何线索吗?

3 个答案:

答案 0 :(得分: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}参考的信息,请参阅here

注意:如下面 jrouquie 所述,超过24小时后会失败。这是date命令的限制,$((D2 - D1))仍然在几秒内给出正确的结果。

答案 1 :(得分: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`

请注意使用--utc来防止夏令时的错误。

注意事项:

此脚本不检查输入。

假定$ 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`

答案 2 :(得分: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`