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

Comparing epoch dates in different formats for a specific time gap

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

我需要检查这两个日期,并确定 "right now" 是否比 jenkins 时间戳至少晚八小时。我认为我正确地转换了第一个时间戳以匹配第二个时间戳的单位(跳水 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."
    }

如何检查这两个时间间隔是否小于八小时?如果在八小时后得到答复,请随意替换今天的日期。

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

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 有 bash 的原生 Mac OS X 版本,它没有 GNU 工具包,也没有 GNU date 命令,所以算术为

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

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