我有两个时间戳,一个是这样的24MAR17:00:14:09
,另一个是这样的2017-03-25 05:52:09.373941000
,我想比较两个时间戳是否相同,我尝试了很多日期函数和 awk 函数,但没有给我结果,请帮助我。
答案1
巴什解决方案:
#!/bin/bash
d1='24MAR17:00:14:09'
d2='2017-03-25 05:52:09.373941000'
d1="$(sed -E 's/^([0-9]{2})([A-Z]{3})([0-9]{2}):/\1-\2-\3 /' <<< $d1)"
if [[ $(date -d "$d1") == $(date -d "$d2") ]]
then
echo "dates are equal"
else
echo "dates are unequal"
fi
答案2
尝试这个,
可以将时间2017-03-25 05:52:09.373941000
转换为第一种格式24MAR17:00:14:09
,然后进行比较。
date_in="24MAR17:00:14:09"
date_out=`date +%d%b%y:%H:%M:%S -d "2017-03-25 05:52:09.373941000" | tr '[:lower:]' '[:upper:]'`
[ $date_in == $date_out ] && echo "The dates match"
答案3
主要问题是解析提供的字符串。命令日期仅接受某些格式,而不是全部。解决方案是利用busybox的接受(几乎)日期能力任何格式。
D1
创建一个格式字符串,以与提供的格式相同的格式打印日期:
$ date -u +'%d%b%y:%T' 07Jul17:15:18:48
使用该字符串告诉 busybox date 如何解析日期字符串。请注意,本地 TZ 可能会更改结果,请使用 -u (UTC) 以避免错误,或者确保为要解析的时间字符串设置正确的 TZ。
$ d1='24MAR17:00:14:09' $ busybox date -u -D '%d%b%y:%T' -d "$d1" Fri Mar 24 00:14:09 UTC 2017
使 busybox 日期打印以秒为单位的值(自纪元以来):
$ busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s' 1490314449
D2
您也可以对第二个时间戳重复该过程,但是在这种情况下,该字符串将直接由日期理解:
$ d2='2017-03-25 05:52:09.373941000'
$ date -u -d "$d2" +'%s'
1490421129
busybox 日期删除了纳秒 ( ${d2%.*}
)(稍后会详细介绍):
$ busybox date -u -d "${d2%.*}" +'%s'
1490421129
差异
您应该已经在两个变量中捕获了上面的结果:
$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
$ resd2="$(date -u -d "$d2" +'%s')"
然后,计算差异并与零比较:
$ (( resd1-resd2 )) && echo "Dates are different" || echo "Dates are equal"
Dates are different
或者直接比较字符串(而不是值):
$ [[ "$resd1" == "$resd2" ]] && echo "equal" || echo "different"
different
纳秒
如果您还需要比较纳秒,则会出现三个问题。
第一个值没有纳秒。首先是第一个日期没有纳秒值。
您可以附加 9 个零:$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')" $ resd1="$resd1""$(printf '%0*d' 9 0)" $ echo "$resd1"echo "$resd2 - $resd1" 1490314449000000000
或者(更好)重新处理带有日期的值:
$ resd1="$(date -u -d "@$resd1" +'%s%N')" $ echo "$resd1" 1490314449000000000
第二个日期有纳秒。在这种情况下,第二个日期具有 date 可以直接处理的格式,但如果它具有需要由 busybox date 预处理的格式,我们将需要稍后附加纳秒。举个例子:
$ d2='2017-03-25 05:52:09.373941000' $ resd2="$(busybox date -u -D '%Y-%m-%d %T' -d "$d2" +'%s')${d2##*.}" $ echo "$resd2" 1490421129373941000
并且,您运行的 bash 需要能够处理 64 位整数。
如果是这样,计算差值:$ echo "(( $resd2 - $resd1 ))" (( 1490421129373941000 - 1490314449000000000 )) $ echo "$(( $resd1 - $resd2 ))" 106680373941000
略高于 106,000 秒(约 29 小时):
$ echo "$(( ($resd2 - $resd1)/10**9 ))" 106680