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

Posted

技术标签:

【中文标题】比较特定时间间隔的不同格式的纪元日期【英文标题】:Comparing epoch dates in different formats for a specific time gap 【发布时间】:2017-09-22 22:59:10 【问题描述】:

从 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."
    

我如何检查这两个时间是否相隔不到 8 小时?如果从现在起超过 8 小时得到答复,请随意替换今天的日期。

【问题讨论】:

【参考方案1】:

您可以在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

【讨论】:

不确定是拼写错误还是用户错误,但我收到了line 2: (1493148707 - )/(60*60) : syntax error: operand expected (error token is ")/(60*60) ") @Alex :这意味着您没有定义变量 jenkinsBuild ,正如您在问题中所声称的那样。定义并尝试返回 我逐个复制了您的脚本字符 - 甚至使用echo 运行它以确保。 if 一定是失败了,但我对你的代码不够熟悉,不知道为什么 @Alex:jenkinsBuild 的值是多少?你能打印出来吗?另外,您可以在脚本开头使用#!/bin/bash 运行它吗 添加路径和行echo $jenkinsBuild - 同样的错误。您拥有的东西是否可能与 mac bash 不兼容?我以前也遇到过这样的问题【参考方案2】:

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

【讨论】:

以上是关于比较特定时间间隔的不同格式的纪元日期的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期时间(在特定时区)转换为纪元秒

将日期从人类可读格式转换为纪元失败

如果条件较旧,纪元日期

如何在 Perl 中将 dd/mm/yyyy 转换为纪元时间?

更改为变量中的硬编码纪元时间?

如果列的值在 Oracle sql 中的格式不同,则使用特定格式更新日期