1

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

例子

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 美元。

它可以被重写以分解重复的代码

编辑:关于第一条评论,这里是一个没有“-r”选项到 sed 的版本(-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 回答