比较特定时间间隔的不同格式的纪元日期
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
【讨论】:
以上是关于比较特定时间间隔的不同格式的纪元日期的主要内容,如果未能解决你的问题,请参考以下文章