比较特定时间间隔的不同格式的纪元日期

时间:2017-04-25 19:06:00

标签: bash date epoch

从Jenkins捕获最后一个构建日期给我一个1493146210998格式的纪元日期,而今天的日期是(大致在撰写本文时)1493146250。显然他们在不同的单位。

我需要查看这两个日期,然后找出现在是""比詹金斯时间戳至少晚八个小时。我想我正确地将第一个时间戳转换成与第二个时间戳相匹配(跳过1000),但比较两者的数学运算让我感到沮丧。

这将是一个bash脚本,最终会像;

jenkinsBuild="1493146210998"
lastBuild=(`expr $jenkinsBuild / 1000`)
currentTime=(`date +%s`)

if( "$lastBuild" is less than eight hours before "$currentTime" ) {
        echo "Times are too close together."
    }

如何检查这两次是否相隔不到八小时?如果从现在开始超过八小时回答,请随意替换今天的日期。

2 个答案:

答案 0 :(得分:1)

您可以在bash中使用$((..))算术运算符if-clause作为

jenkinsBuild="1493146210998"
if (( $(( ($(date +%s) - $(date -d@${jenkinsBuild:0:10} +%s))/(60*60) )) < 8 )); then
    echo "Times are too close together."
fi

我们的想法是从jenkinsBuild变量中获取10位数字并执行GNU日期算术以获得EPOCH值(以小时为单位)并查看它是否小于8以使条件有效。

似乎OP具有Mac OS X的本地bash版本,它没有GNU工具包,也没有GNU date命令,因此算法为

jenkinsBuild="1493146210998"
if (( $(( ($(date +%s) - ${jenkinsBuild:0:10} )/(60*60) )) < 8 )); then
    echo "Times are too close together."
fi

答案 1 :(得分:0)

bash v4.4+中,您可以使用纯粹的bash,例如:

jenkinsBuild="1493146210998"
diff=$(( $(printf "%(%s)T") - (jenkinsBuild/1000) ))

(( diff < 8*60*60 )) && echo "Too close" || echo "OK"

#or    
if (( diff < 8*60*60 )); then
        echo "Too close"
else
        echo OK
fi